【问题标题】:.htaccess mod_rewrite loop.htaccess mod_rewrite 循环
【发布时间】:2015-10-26 00:23:25
【问题描述】:

我正在实施一些 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>

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

谢谢!

【问题讨论】:

    标签: apache .htaccess mod-rewrite redirect


    【解决方案1】:

    重写引擎循环,因此当引擎循环时,您最后一个重写查询字符串的规则会被第一条规则捕获。您需要匹配%{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>
    

    【讨论】:

    • 这正是我想要的。我没有意识到引擎循环,所以我遇到的行为是有道理的。我将我的 %{QUERY_STRING} 规则替换为根据您的回答使用 %{THE_REQUEST} 的规则,现在它可以按预期工作了!谢谢!
    猜你喜欢
    • 2017-05-14
    • 2016-06-06
    • 1970-01-01
    • 2011-01-12
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多