【问题标题】:Apache mod_rewrite: perform http to https redirect on URL that has already undergone a URL RewriteApache mod_rewrite:对已经经历过 URL 重写的 URL 执行 http 到 https 重定向
【发布时间】:2012-10-05 03:55:13
【问题描述】:

问题如下:

我正在执行 URL 重写以从带有参数的 URL 创建规范 URL。例如:

RewriteRule ^somename/(.*)/(.*.html)$ index.php?pram1=someparam&param2=$1&param3=$2 [QSA,L]

现在,我还要检查页面是否使用 https 协议,如果没有,则进行 301 重定向。

问题:Apache 在使用 REQUEST_URI 时似乎无法识别新的(规范 URL)。相反,REQUEST_URI 返回 index.php?... URL。

这使得无法获取当前(规范 URL)、检查 HTTPS 并在必要时重定向到它。

例如,

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} (somename)
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301]

根本不起作用,因为 (somename) 不在 URI 中(请记住,{REQUEST_URI} 包含原始 URL)。

我可以匹配 QUERY_STRING,但重定向会将我带到原始 URL

RewriteCond %{HTTPS} off
RewriteCond %{QUERY_STRING} (param1)
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301]

过去一小时我一直在互联网上寻找解决方案,但我无法找到解决方案。我想也许有一种方法可以创建一个环境变量来保存新的(规范)URL,但也没有找到一种方法来做到这一点。

有什么可能有帮助的建议吗?

【问题讨论】:

    标签: apache mod-rewrite http-status-code-301


    【解决方案1】:

    根本不起作用,因为 (somename) 不在 URI 中(请记住,{REQUEST_URI} 包含原始 URL)。

    不正确,%{REQUEST_URI} 实际上是当前的 URI,在 URL 文件映射处理管道期间通过 mod_rewite 或其他模块对其进行了任何修改之后。你想要的大概是%{THE_REQUEST}:

    RewriteCond %{HTTPS} off
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(somename/[^\ ]*)
    RewriteRule ^ https://%{SERVER_NAME}/%1 [R=301,L]
    

    但是,我怀疑这不是真正的问题。问题是您放置规则的顺序以及重定向没有L 标志。这应该做你想做的事:

    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
    
    RewriteRule ^somename/(.*)/(.*.html)$ index.php?pram1=someparam&param2=$1&param3=$2 [QSA,L]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      相关资源
      最近更新 更多