我正在设置Zend_Cache_Backend_Static并根据手册(http://framework.zend.com/manual/en/zend.cache.backends.html),它要求“对默认.htaccess文件进行一些更改,以便将请求定向到静态文件(如果存在)”。
我的问题是下面建议的模式对我不起作用:
RewriteCond %{DOCUMENT_ROOT}/cached/%{REQUEST_URI}.(html|xml|json|opml|svg) -f
RewriteRule .* cached/%{REQUEST_URI}.%1 [L]
我违反了规则,发现以下内容对我有用:
RewriteCond %{DOCUMENT_ROOT}/cached/%{REQUEST_URI}.html -f
RewriteRule .* cached/%{REQUEST_URI}.html [L]
进一步细分以下模式不起作用:
RewriteCond %{DOCUMENT_ROOT}/cached/8hc.(html|xml) -f
RewriteRule (.*) cached/8hc.html [L]
这样做:
RewriteCond %{DOCUMENT_ROOT}/cached/8hc.html -f
RewriteRule (.*) cached/8hc.html [L]
在我看来,RewriteCond中的捕获组括号不起作用。
任何人都可以解释为什么会这样吗? 我没有在Apache中设置一些设置吗?
Apache版Apache / 2.2.14(Win32)
答案 0 :(得分:1)
RewriteCond
的语法与RewriteRule
不同:
RewriteCond TestString CondPattern
此处 CondPattern 是允许使用正则表达式或其他特殊模式(如-f
)的部分。但 TestString 是一个普通字符串,只扩展了环境变量(%{NAME}
)和引用($n
,%n
)。
所以为了完成这项工作,你需要一些像这样的案例区分:
RewriteCond .html .+
RewriteCond %{DOCUMENT_ROOT}/cached/%{REQUEST_URI}%0 -f [OR]
RewriteCond .xml .+
RewriteCond %{DOCUMENT_ROOT}/cached/%{REQUEST_URI}%0 -f [OR]
RewriteCond .json .+
RewriteCond %{DOCUMENT_ROOT}/cached/%{REQUEST_URI}%0 -f [OR]
RewriteCond .opml .+
RewriteCond %{DOCUMENT_ROOT}/cached/%{REQUEST_URI}%0 -f [OR]
RewriteCond .svg .+
RewriteCond %{DOCUMENT_ROOT}/cached/%{REQUEST_URI}%0 -f
RewriteRule .+ cached/%{REQUEST_URI}%0 [L]
此处每个测试包含两个条件,其中第一个条件用于捕获要在RewriteRule
中使用的文件扩展名。
答案 1 :(得分:0)
这是我用来测试重写规则的网站: Rewrite Tester