.htaccess重写规则适用错误

时间:2014-04-20 11:57:23

标签: php apache .htaccess mod-rewrite

我是htaccess的新手,我想使用RewriteRule以使网址更加友好,但我遇到了问题。 这是我的htaccess文件

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteRule download/(.*)$ download.php?file=$1 [NC]
  RewriteRule download/view/(.*)/(.*)$ download_view.php?name=$1&id=$2 [NC]
</IfModule>

例如,无论我导航到localhost/download/view/test/2/,它都会显示为第一个网址localhost/download/test/

如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

扭转这两条规则的顺序,以便更专业的规则首先出现。然后使用额外的L标志以防止在匹配后进一步重写:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteRule download/view/(.*)/(.*)$ download_view.php?name=$1&id=$2 [NC,L]
  RewriteRule download/(.*)$ download.php?file=$1 [NC]
</IfModule>

答案 1 :(得分:2)

您的第一个重写规则已经更改了URI:

RewriteRule download/(.*)$ download.php?file=$1 [NC]

因此localhost/download/view/test/2/已被重写为download.php?file=view/test/2/,而您有意与之匹配的第二条规则不再匹配:

RewriteRule download/view/(.*)/(.*)$ download_view.php?name=$1&id=$2 [NC]

这与download.php?file=view/test/2/不匹配。

所以你可以通过首先检查download/view/...来解决这个问题,方法是翻转这两个:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteRule download/view/(.*)/(.*)$ download_view.php?name=$1&id=$2 [NC]
  RewriteRule download/(.*)$ download.php?file=$1 [NC]
</IfModule>

始终从最具体/特定的规则开始,以排除此类问题。在更困难的情况下,使用RewriteCond来微调何时应用重写规则。

我还建议如果你想在URI路径的开头匹配,你应该使用插入符号(“^”)来标记正则表达式中的开头:

  RewriteRule ^download/view/(.*)/(.*)$ download_view.php?name=$1&id=$2 [NC]
  RewriteRule ^download/(.*)$ download.php?file=$1 [NC]