首先,如果您在 .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]
请记住,如果存在与您服务器上的任何文件或目录同名的用户,则此解决方案会导致冲突。