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 重定向不适用于现有规则的主要内容,如果未能解决你的问题,请参考以下文章

重定向到 https 不适用于 www

在 IIS7 URL 重写模块中,我可以在重定向规则中指定不适用于 http-post 请求吗?

.htaccess 重定向桌面但不适用于移动浏览器

在 Codeigniter 中将 http 重定向到 https

Nginx 重定向(非 www 到 www)不适用于 Certbot

.htaccess 内部重定向不适用于字符串参数