RewriteCond捕获组不匹配

时间:2011-01-06 10:25:25

标签: zend-framework .htaccess mod-rewrite

我正在设置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)

2 个答案:

答案 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