我的Apache服务器上有以下.htaccess
文件,该文件不起作用
<If "%{HTTP_HOST} == 'www.example.com'">
RewriteCond %{REMOTE_ADDR} !^192\.168\.8\.8$
RewriteRule .* - [F]
RewriteRule ^([A-Za-z0-9_-]+)$ index.php?p=$1 [NC,L]
</If>
代码在没有if-Statement的情况下工作正常。但是使用if语句
RewriteRule ^([A-Za-z0-9_-]+)$ index.php?p=$1 [NC,L]
不起作用返回“404 Not Found”错误
2条答案
按热度按时间js5cn81o1#
这个"问题"是因为mod_rewrite指令嵌入在
<If>
表达式中。<If>
块在请求Map回文件系统之后很晚才合并。在这个上下文中,RewriteRule
* pattern * 匹配的是绝对文件系统路径,而不是相对URL路径,所以上面的第二条规则不会像预期的那样匹配。因此,规则需要这样重写:
或者,更简单地说,删除字符串开头的锚-尽管这确实会使匹配有点模糊:
或者,最好完全避免使用
<If>
结构,因为您可能会与其他指令(<If>
结构之外)发生意外冲突。举例来说:(The
NC
标志在第二条规则中是不必要的,因为你已经在正则表达式中匹配了A-Z
和a-z
。另外,在第一条规则中使用^
而不是.*
,因为您不需要在这里实际匹配任何东西。如果你有 * 许多 * 这样的规则只适用于这一个主机,那么你可以颠倒逻辑,跳过 * N * 规则,当请求的主机是 * 不是 * 什么是预期的。举例来说:
rks48beu2#
我自己提出了以下的解决办法。我很喜欢。