我正在使用带有Apache和PHP的mod_rewrite来重写页面的URL 对于网站上的一个页面,我使用以下,工作正常:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(\d+)/? index.php?id=$1
</IfModule>
但是,对于网站上的另一个页面(我遇到问题),我使用以下内容:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(\w+)/? index.php?id=$1
</IfModule>
基本上,\d
更改为\w
出于某种原因,对于\w
页面,id
参数设置为index
,而不是URL中的实际值。
如果我将\w
更改为.
,则id
参数等于index.php
。
当我查看PHP $_SERVER
超全局时,REDIRECT_QUERY_STRING
参数已正确设置,但QUERY_STRING
参数设置为index
或index.php
(取决于我是使用\w
还是.
)。
这里发生了什么以及为什么? 更重要的是,我该如何解决这个问题呢? 谢谢。
答案 0 :(得分:1)
这是因为您的模式只执行了多次,因为您的模式只有^(\w+)/?
而没有锚$
。
您可以通过在该规则之前添加RewriteCond
来解决此问题:
<IfModule mod_rewrite.c>
RewriteEngine On
# If the request is not for a valid directory
RewriteCond %{REQUEST_FILENAME} !-d
# If the request is not for a valid file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+?)/?$ index.php?id=$1 [L,QSA]
</IfModule>