我正在尝试创建.htaccess文件中使用的规则,以匹配除之外的任何字符串,在这种情况下为index
。
我认为应该可以先匹配此特殊字符串并使用[L]
,但这不起作用,
并且应该可以使用以下正则表达式,但它会导致500错误。
我想要匹配:
但不是
(BTW“index”是没有扩展名的文件的名称,不是我的选择,这是一件工作的事情)
^(?!index)[\w/\-]+
我认为apache的正则表达式实现不符合(?!xxx)
规则。
非常感谢任何帮助/建议。
答案 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 ^([^/]+)/(.*) …