行,
所以我正在使用(或尝试使用)两个主要的 mod_rewrite 规则,它们似乎相互冲突
RewriteRule ^/?help$ index.php?page=help [L]
和
RewriteRule ^/?([a-zA-Z0-9._-]+)$ index.php?user=$1 [L]
如果我摆脱了句号->。在第二条规则中,显示了我的帮助页面,并且我也可以显示用户页面,但是当我添加句点时,我的帮助页面不会显示,而是(我认为)被作为用户页面处理。
有人有任何指示吗?
行,
所以我正在使用(或尝试使用)两个主要的 mod_rewrite 规则,它们似乎相互冲突
RewriteRule ^/?help$ index.php?page=help [L]
和
RewriteRule ^/?([a-zA-Z0-9._-]+)$ index.php?user=$1 [L]
如果我摆脱了句号->。在第二条规则中,显示了我的帮助页面,并且我也可以显示用户页面,但是当我添加句点时,我的帮助页面不会显示,而是(我认为)被作为用户页面处理。
有人有任何指示吗?
首先,如果您在 .htaccess 中执行此操作,mod_rewrite 不会停止处理,而是执行内部重定向。有关详细信息,请参阅此答案。
您需要在第二个重写规则中转义句点。如果没有转义,句点(或点)将匹配任何字符。
固定规则:
RewriteRule ^/([a-zA-Z0-9\._-]+)$ /index.php?user=$1 [L]
编辑3:
根据您的评论和自己的答案,这是一个更新的解决方案。在 Apache 中的工作方式RewriteCond %{REQUEST_FILENAME}取决于您所处的上下文。您也可以?从匹配模式中省略 。
RewriteRule ^/help$ /index.php?page=help [L]
# If you are inside <VirtualHost> context
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
RewriteRule ^/([a-zA-Z0-9\._-]+)$ /index.php?user=$1 [L]
# If you are inside <Directory> or .htaccesscontext
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/([a-zA-Z0-9\._-]+)$ /index.php?user=$1 [L]
请记住,如果存在与您服务器上的任何文件或目录同名的用户,则此解决方案会导致冲突。
我查看了另一个用户在这里遇到的东西 - Apache / mod_rewrite / Periods messing with pattern,并修改了他的规则,它正在工作 -
RewriteRule ^/?help$ index.php?page=help [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?([a-zA-Z0-9\[\]\.()+|_-]+)$ index.php?user=$1 [L]
感谢您的答复。