.htaccess mod_rewrite循环

时间:2015-08-03 19:14:32

标签: apache .htaccess mod-rewrite redirect

我正在努力实现一些mod_rewrite .htaccess规则来创建干净的URL。具体来说,当用户提交带有GET请求的表单时,我正在尝试确保通过301清除URL(目前使用302进行测试以避免缓存)。

我遇到的问题是我的规则正在创造一个无限循环。

重定向用户获取请求的规则(以避免用户在浏览器中看到?query1 =& query2 =):

RewriteCond %{QUERY_STRING} ^query1=(.*)&query2=(.*)$ [NC]
RewriteRule ^results.php$ /results/%1/%2? [R=302,NC,L]

但是,我还有一条规则要进一步格式化访问/ results /转发到results.php的任何人(例如从“返回结果”链接):

RewriteRule results/(.*)/(.*)$ results.php?query1=$1&query2=$2 [NC,L]

完整.htaccess文件:

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{QUERY_STRING} ^query1=(.*)&query2=(.*)$ [NC]
    RewriteRule ^results.php$ /results/%1/%2? [R=302,NC,L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteRule results/(.*)/(.*)$ results.php?query1=$1&query2=$2 [NC,L]
</IfModule>

有关如何解决此问题的任何建议吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

重写引擎循环,因此当引擎循环时,重写到查询字符串的最后一条规则会被第一条规则捕获。您需要匹配%{QUERY_STRING}变量,而不是匹配%{THE_REQUEST}变量,以免受其他重写影响:

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{THE_REQUEST} /results\.php\?query1=([^&]+)&query2=([^&\ ]+) [NC]
    RewriteRule ^results.php$ /results/%1/%2? [R=302,NC,L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteRule results/(.*)/(.*)$ results.php?query1=$1&query2=$2 [NC,L]
</IfModule>