mod_rewrite和rewritecond

时间:2011-09-07 19:01:00

标签: apache .htaccess mod-rewrite

我试图根据URI中的条件运行重写。总之,如果uri有一个字符串,并且不包含另一个字符串,请执行重定向。我现在有一个错误,但需要一些帮助才能让它发挥作用。

RewriteCond %{REQUEST_URI} (.*)usb-3-hard-drive(.*) [NC]

RewriteCond %{REQUEST_URI} !(*)start$

RewriteRule .* /en/manuals/usb-3-hard-drive/start [L]

请求网址:http://www.domain.tld/dir1/ usb-3-hard-drive / *

新网址:http://www.domain.tld/dir1/usb-3-hard-drive / start

当然,如果条件不符合,则后续的重写仍应受到尊重。

谢谢......

1 个答案:

答案 0 :(得分:3)

出现什么样的错误?您应该查看Apache的错误日志以获取详细的错误消息。

无论如何 - 我怀疑Apache抱怨糟糕的正则表达式语法。如果它不是复制粘贴的错字(不知何故),那么错误就在这里:!(*)start$ - 它本身没有*这样的东西 - 你错过了点{{1在它之前 - 很可能你的意思是.

以下是更优化且完全正常工作的规则:

!(.*)start$

顺便说一句 - 它没有像你提到的那样“执行重定向” - 它只会在浏览器中URL保持不变时进行静默重写(内部重定向)。如果您想在浏览器地址栏中更改网址时进行正确的重定向(3xx代码),请在RewriteCond %{REQUEST_URI} /usb-3-hard-drive/ [NC] RewriteCond %{REQUEST_URI} !/start$ RewriteRule .* /en/manuals/usb-3-hard-drive/start [L] 旁边添加,R=301(或您喜欢的任何重定向代码),即[L]