.htaccess重写正则表达式:匹配除“索引”之外的任何内容

时间:2009-10-10 14:13:01

标签: regex apache .htaccess

我正在尝试创建.htaccess文件中使用的规则,以匹配之外的任何字符串,在这种情况下为index

我认为应该可以先匹配此特殊字符串并使用[L],但这不起作用,
并且应该可以使用以下正则表达式,但它会导致500错误。

我想要匹配:

  • pagename1
  • pagename2 /不管
  • pagename3 / 234 /不管
  • 接触我们
  • (等)

但不是

  • 索引/ 123
  • 索引/ 124 /不管

(BTW“index”是没有扩展名的文件的名称,不是我的选择,这是一件工作的事情)

^(?!index)[\w/\-]+

我认为apache的正则表达式实现不符合(?!xxx)规则。

非常感谢任何帮助/建议。

3 个答案:

答案 0 :(得分:16)

您可以使用RewriteCond来执行此操作,例如:

RewriteCond %{REQUEST_URI} !^index
RewriteRule (.*) index.php?what=$1

这将重写每个不以索引开头的URL。如果您希望它在网址中的任何位置避开它,请删除^

答案 1 :(得分:4)

(请阅读评论。我对此表示怀疑,我从未遇到过问题,但它提供了一个更清晰的.htaccess文件,但是:使用RewriteCond 可能由于rulesets are processed

的方式,优先使用带有短划线的RewriteRule

按如下方式使用RewriteRule, not 重写(短划线),并停止后续重写([L])以查找以index/开头的内容:

# Do not rewrite anything that starts with index/
RewriteRule ^index/ - [L]

在此之后,做任何你喜欢的改写。

或者甚至可能首先限制一些:

# Do not rewrite files, directories or symbolic links 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d [OR] 
RewriteCond %{REQUEST_FILENAME} -l 
RewriteRule . - [L]

答案 2 :(得分:1)

Apache使用了三种不同的正则表达式实现。第一个是System V8,因为Apache 1.3使用POSIX ERE,而Apache 2使用PCRE。并且只有PCRE支持预见断言。因此,您需要Apache 2才能使用该规则。

但现在问你的问题。如果您使用此规则:

RewriteRule ^index/ - [L]

任何以/index/开头的内容都应该遵守此规则,不应再采用其他规则。

但如果这不起作用,试试这个:

RewriteRule !^index/ …

同样,此规则将应用于任何网址路径不以/index/开头的请求。

如果您想从URL捕获任何内容,请使用RewriteCond条件来测试完整的URL路径本身(%{REQUEST_URI})或仅测试其中一个模式组的匹配:

RewriteCond %{REQUEST_URI} !^/index/
RewriteRule (.*) …
# or
RewriteCond $1 !^index$
RewriteRule ^([^/]+)/(.*) …