1

行,

所以我正在使用(或尝试使用)两个主要的 mod_rewrite 规则,它们似乎相互冲突

RewriteRule ^/?help$ index.php?page=help [L]

RewriteRule ^/?([a-zA-Z0-9._-]+)$ index.php?user=$1 [L]

如果我摆脱了句号->。在第二条规则中,显示了我的帮助页面,并且我也可以显示用户页面,但是当我添加句点时,我的帮助页面不会显示,而是(我认为)被作为用户页面处理。

有人有任何指示吗?

4

2 回答 2

0

首先,如果您在 .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]

请记住,如果存在与您服务器上的任何文件或目录同名的用户,则此解决方案会导致冲突。

于 2012-12-07T10:51:43.603 回答
0

我查看了另一个用户在这里遇到的东西 - 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]

感谢您的答复。

于 2012-12-07T21:42:17.930 回答