.htaccess对mod_rewrite规则的灵活性

时间:2013-05-14 08:01:46

标签: apache .htaccess mod-rewrite

我想将旧的php文件重定向到新的seo友好文件:

user.php?user = $ var1& task = $ var2 - > URL / $ VAR1 / $ VAR2

有两个问题。每次都没有设置$ var2,所以我不知道如何处理它,并且最后总是添加查询字符串。

我使用以下重定向规则进行测试(没有$ var2)

RewriteCond %{THE_REQUEST} ^(.+)user\.php(.+)$
RewriteCond %{QUERY_STRING} user=([^/]+)$
RewriteRule ^(.+)\.php$ %1 [R]

我明白了:

    url/$var1/?user=$var1

第二个问题是重写规则,以便url / $ var1 - > user.php的?USER = $ VAR1 没有它我会收到服务器错误。

在我尝试使用静态测试的那一刻,但这不是唯一的规则,因此条件在这里是错误的

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ user.php?user=$1 [L]

如何使用变量获得正确的结果和更大的灵活性? mod_rewrite不是我的世界,所以我希望你能在黑暗中带来光明。

Thx ruven

1 个答案:

答案 0 :(得分:1)

1)防止查询字符串结尾的方法是添加一个?在您重写的URL的末尾。

RewriteCond %{THE_REQUEST} ^GET\ /user\.php
RewriteCond %{QUERY_STRING} user=([^&=]+)$
RewriteRule ^user\.php %1? [R]

如果设置了var1和var2,它将是

RewriteCond %{THE_REQUEST} ^GET\ /user\.php
RewriteCond %{QUERY_STRING} user=([^&=]+)$
RewriteCond %{QUERY_STRING} task=([^&=]+)$    
RewriteRule ^user\.php %1/%2? [R]

将这些(首先是第二个)结合起来,它应该根据需要重定向

2)由于这是一种“全部捕获”的URL,你应该将它作为.htaccess中的最后一个选项,并将所有不是文件或目录重定向到user.php然后让user.php确定用户是否存在,如果没有用HTTP 404响应。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ user.php?user=$1 [L]

(我已经删除了/,因为对于完全相同的内容而言,拥有两个网址并不是一个好主意。)