我是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/
如何解决这个问题?
答案 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]