我想将旧的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
答案 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]
(我已经删除了/,因为对于完全相同的内容而言,拥有两个网址并不是一个好主意。)