HTTP 到 HTTPS 重定向不适用于现有规则
Posted
技术标签:
【中文标题】HTTP 到 HTTPS 重定向不适用于现有规则【英文标题】:HTTP to HTTPS redirect not working with existing rules 【发布时间】:2022-01-19 09:01:00 【问题描述】:我已经做了 3 天了,没有任何结果!
我有一个现有的 http 站点,它有很多重定向规则,具体取决于 URL 友好链接,我现在需要强制加载到 https - Google 最终会将它们从索引中删除,但有很多来自第 3 方的页面链接我无法实际更改的网站。
下面的.htaccess 处理http://example.com,但显然不是http://www.example.com
问题是,如果我添加一个重写并让它专门将 url 前缀更改为 https,它要么根本不起作用,要么会转发到 https://www.example.com,但随后会给出一个错误消息,因为重定向太多(取决于我尝试过的 http 到 https 的版本)。
我还尝试将代码拆分为首先检查 https/redirect,然后检查非 www,但是当它正确转发时,它会再次创建循环或剥离原始查询。
帮助!哈哈
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %HTTP_HOST ^example\.co\.uk [NC]
RewriteRule ^(.*)$ https://www.example.co.uk/$1 [R=301,L]
RewriteRule ^2/Home https://www.example.co.uk/ [QSA,L]
RewriteRule ^([^/\.]+)/([^/\.]+)/?$ index.php?docid=$1&docname=$2 [QSA,L]
RewriteRule ^item/([^/\.]+)/([^/\.]+)/?$ item.php?prodid=$1&prodname=$2 [QSA,L]
RewriteRule ^search/ store.php [QSA,L]
RewriteRule ^store/([^/\.]+)/([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ store.php?catid=$1&startPage=$2&limitPerPage=$3&searchTerm=$4 [QSA,L]
RewriteRule ^store/([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ store.php?catid=$1&startPage=$2&limitPerPage=$3 [QSA,L]
RewriteRule ^store/([^/\.]+)/([^/\.]+)/?$ store.php?catid=$1&catname=$2 [QSA,L]
RewriteRule ^sitemap\.xml/?$ sitemap.php
ErrorDocument 404 /15/Error
AddType application/x-font-woff2 .woff2
SetEnvIfNoCase User-Agent "^libwww-perl*" block_bad_bots
Deny from env=block_bad_bots
#6 month for image files
<filesMatch ".(jpg|jpeg|png|gif|ico)$">
Header set Cache-Control "max-age=15552000, public"
</filesMatch>
ExpiresActive On
ExpiresByType image/gif A2592000
ExpiresByType image/png A2592000
ExpiresByType image/jpg A2592000
ExpiresByType image/jpeg A2592000
# 6 month for css and js
<filesMatch ".(css|js)$">
Header set Cache-Control "max-age=15552000, public"
</filesMatch>
# long expire
<filesMatch ".(woff2)$">
Header set Cache-Control "max-age=102628000, public"
</filesMatch>
<IfModule mod_deflate.c>
#Enable Gzip compression
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/json
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/eot
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/vnd.microsoft.icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/xml
# Remove browser bugs for legacy browsers
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
Header append Vary User-Agent
</IfModule>
<IfModule mod_expires.c>
ExpiresActive On
# Images
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/webp "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# Video
ExpiresByType video/mp4 "access plus 1 year"
ExpiresByType video/mpeg "access plus 1 year"
# CSS, JavaScript
ExpiresByType text/css "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
# Others
ExpiresByType application/pdf "access plus 1 month"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
</IfModule>
【问题讨论】:
【参考方案1】:您当前在您发布的.htaccess
代码中没有 HTTP 到 HTTPS 重定向,因此任何人都可以猜测它为什么不适合您。
但您需要在.htaccess
的顶部紧跟RewriteBase
指令之后添加类似以下内容:
RewriteCond %HTTPS off
RewriteRule (.*) https://www.example.com/$1 [R=301,L]
这是“标准”HTTP 到 HTTPS 重定向。但是,这是否有效(并导致重定向循环)可能取决于 HTTPS 在您的服务器上的管理/实施方式。例如,您是否使用管理 SSL 的前端代理(例如 Cloudflare FREE)?
如果您使用的是前端代理,那么您可能需要将其更改为:
RewriteCond %HTTP:X-Forwarded-Proto !https [NC]
RewriteRule (.*) https://www.example.com/$1 [R=301,L]
或者,某些共享主机使用HTTPS
环境 变量,而不是第一个示例中使用的HTTPS
server 变量:
RewriteCond %ENV:HTTPS off
RewriteRule (.*) https://www.example.com/$1 [R=301,L]
编辑: 这个来自 2017 年的 related question 建议与上述类似的内容用于主机“123-reg”(已收到 123-reg 本身的回复)。他们使用了 CondPattern !=on
,这应该没什么区别,除非 123-reg 做的事情有点奇怪?! HTTPS
environment(以及类似命名的server)变量应该包含字符串“off”或“on”。所以,检查off
还是!on
并不重要——结果应该是一样的。
注意:首先使用 302(临时)重定向进行测试,以确保它工作正常 - 这是为了避免任何潜在的缓存问题。您需要在测试前清除浏览器缓存。
更新:该网站与 123-reg 共享主机
This 123-reg support page 状态:
在我们的 Linux 共享主机帐户上,环境变量 SSL 将在连接受 SSL 保护时设置。
如果是这种情况,那么您应该能够改为执行以下操作:
RewriteCond %ENV:SSL ^$
RewriteRule (.*) https://www.example.com/$1 [R=301,L]
如果 SSL
环境变量为空(即未设置),则上述重定向到 HTTPS。
【讨论】:
感谢您的回答。 (我的代码中省略了 http 到 https,因为它中断了!) - 我尝试了您的建议:前 2 个重定向到 https,但随后我收到了可怕的“您的页面未正确转发”消息。当我尝试第 3 次时,没有任何反应。该网站与 123-reg 共享主机 123-reg 似乎使用了SSL
环境变量。我已经更新了我的答案。 (如果是这种情况,那么这对于 123-reg 来说是相当独特的。)确切地知道 SSL
env var 设置为什么会很有趣(它是否具有特定/有意义的值或只是 1
或空)。您可以在 PHP 代码中检查这些环境变量。
好的。试过了 - 转发正常,但又卡在了循环中。在删除上面我的原始代码的第 4 行和第 5 行后尝试了它 - 仍然相同:-(
如果您直接请求,大概(没有重定向)https://www.example.com/...
可以正常工作吗?请在请求 HTTP 和 HTTPS 时检查 SSL
env var。检查浏览器中的 HTTP 流量......在实现上述重定向时,您究竟看到了什么重定向?它是反复尝试重定向到 HTTPS 还是被重定向回 HTTP 然后 HTTPS 然后 HTTP 然后 HTTPS? (第 4 行和第 5 行仍然需要规范化 www 子域,并且不会导致任何问题。)
万岁!相关问题中的解决方案有效!即,使用 !=on 并将我的非 www 下面的行移动到 www ! (我之前尝试过移动线条,但不是那个选项)。 123-reg 还没有回答我上周的查询,虽然我搜索了 ***,但我没有找到以前的帖子 - 所以感谢您的时间和帮助,我的理智现在恢复了! :-)以上是关于HTTP 到 HTTPS 重定向不适用于现有规则的主要内容,如果未能解决你的问题,请参考以下文章
在 IIS7 URL 重写模块中,我可以在重定向规则中指定不适用于 http-post 请求吗?
在 Codeigniter 中将 http 重定向到 https