0

问题如下:

我正在执行 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,但是也没有找到一种方法来做到这一点。

任何可能有帮助的建议?

4

1 回答 1

0

根本不起作用,因为 (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]
于 2012-10-04T19:55:13.670 回答