为什么URL参数值等于“index.php”?

时间:2014-12-08 15:10:39

标签: php apache .htaccess mod-rewrite query-string

我正在使用带有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参数设置为indexindex.php (取决于我是使用\w还是.)。

这里发生了什么以及为什么? 更重要的是,我该如何解决这个问题呢? 谢谢。

1 个答案:

答案 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>