apache - .htaccess mod_rewrite 循环

标签 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>

关于如何解决这个问题有什么建议吗?

谢谢!

最佳答案

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

<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>

关于apache - .htaccess mod_rewrite 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31795019/

相关文章:

node.js - NodeJS Express 和 Apache 在同一服务器上

apache - Laravel 使用 Mod_rewrite 强制 HTTPS

apache - 标题未设置 RewriteRule [R=302,L]

php - 有条件地将页面从 http 重定向到 https 或 https 到 http

php - 无法使用 PHP 5.5 在 Ubuntu 14.04 上的 Laravel 4.2 中获得任何路由

windows - Windows 不再有 SVN 控制台客户端?

php - .htaccess 和 mod_rewrite 到使用不同标准的平面 URL

apache - 使用 .htaccess 更改文件夹中所有 php 文件的 URL

.htaccess 从 GET 变量重定向到 url 字符串

apache - (Apache) 可以在重写规则中匹配 UTF8 字符吗?