1

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

user.php?user=$var1&task=$var2 -> url/$var1/$var2

有2个问题。$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 目前不是我的世界,所以我希望你能在黑暗中带来光明。

谢谢你

4

1 回答 1

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]

(我删除了最后的 / 因为对于完全相同的内容有两个 URL 不是一个好主意)。

于 2013-05-16T08:20:14.120 回答