mod_rewrite和正则表达式OR条件

时间:2014-10-14 03:14:02

标签: regex apache .htaccess mod-rewrite

OR 条件是否适用于mod_rewrite?我的规则是抛出内部服务器错误:

RewriteRule ^(Bob|Sam|Arnold|Brian).htm$ http://newdomain.net/$1 [R=301, L]

或者,是否有更好的重写系统可以加载可能的页面名称列表进行重写?或者可能是一种相反的方法 - 正则表达式选择哪些页面不重写? (说,不是indexabbreviationscontact)。

2 个答案:

答案 0 :(得分:2)

您可能收到500服务器错误,因为L标志前有空格。 Apache对于解析指令及其参数并不是那么聪明,因此当apache看到一个空格时,它会假定参数的开始/结束。因此,[R=301,L]最终被解释为2个不同的参数,并且它们无法单独有效。

“OR”功能很好。

RewriteRule ^(Bob|Sam|Arnold|Brian)\.htm$ http://newdomain.net/$1 [R=301,L]

您可以使用?!类型的组进行否定匹配:

RewriteRule ^(?!index|abbreviations|contact)(.*)\.htm$ http://newdomain.net/$1 [R=301,L]

答案 1 :(得分:0)

以下是我将如何处理OR。您需要将它们分成RewriteCond

RewriteEngine On
RewriteCond %{REQUEST_URI} ^(Bob|Sam|Arnold|Brian).htm$ [OR]
# Another RewriteCond would go here as the "OR" like:
RewriteCond %{REQUEST_URI} !^(index|abbreviations|contact) # ! = "not"
RewriteRule ^(.*)$ http://newdomain.net/$1 [R=301, L]

只要能够“加载可能的页面名称列表进行重写”,除了用mod_rewrite手动列出它们之外,我不知道有什么方法可以做到这一点。我知道nginx,例如,据说有更深入的特征涉及到它。