为什么我的 .htaccess 文件不重定向到 https?怎么修?

Why doesn't my .htaccess file redirect to https? How to fix?

哦天啊,我已经尝试过一百万次,一百万种不同的方式使用 Whosebug,使用博客,我的网络主机甚至曾经做过,但没有成功,或者我对缓存的摆弄破坏了它。

我想将所有 HTTP:// 流量重定向到 https,这会阻止人们购买。

这就是文件的内容,需要修改什么???

AddType text/html .shtml
AddHandler server-parsed .shtml
Options Indexes FollowSymLinks Includes
AddHandler server-parsed .html .htm
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilter DEFLATE .shtml
</IfModule>

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.pottertour.co.uk/ [R,L]
</IfModule>

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault "access plus 10 days"
    ExpiresByType text/html "access plus 1 day"
    ExpiresByType text/css "access plus 0 day"
    ExpiresByType text/plain "access plus 1 month"
    ExpiresByType image/gif "access plus 1 month"
    ExpiresByType image/png "access plus 1 month"
    ExpiresByType image/jpeg "access plus 1 month"
    ExpiresByType image/jpg "access plus 1 month"
    ExpiresByType image/webp "access plus 1 month"  
    ExpiresByType application/x-javascript "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 week"
    ExpiresByType application/x-icon "access plus 1 year"
</IfModule>
# END EXPIRES

好的,我尝试按照 MrWhite 的评论删除 <IfModule mod_rewrite.c> 包装器,它似乎使加载处于一个恒定的循环中。所以我把它恢复到原来的样子,但没有包装纸。如下所示。

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^pottertour.co.uk [NC]   
RewriteRule ^(.*)$ https://www.pottertour.co.uk/ [L,R=301]   

非常感谢解决方案和解释。

好的,感谢 MrWhite,我又试了一次,整个 .htacess 文件现在位于:

AddType text/html .shtml
AddHandler server-parsed .shtml
Options Indexes FollowSymLinks Includes
AddHandler server-parsed .html .htm
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilter DEFLATE .shtml
</IfModule> 

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault "access plus 10 days"
    ExpiresByType text/html "access plus 1 day"
    ExpiresByType text/css "access plus 10 day"
    ExpiresByType text/plain "access plus 1 month"
    ExpiresByType image/gif "access plus 1 month"
    ExpiresByType image/png "access plus 1 month"
    ExpiresByType image/jpeg "access plus 1 month"
    ExpiresByType image/jpg "access plus 1 month"
    ExpiresByType image/webp "access plus 1 month"  
    ExpiresByType application/x-javascript "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 week"
    ExpiresByType application/x-icon "access plus 1 year"
</IfModule>
# END EXPIRES

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

请注意,我通过省略 R=301

删除了对永久重定向的所有引用

无论如何,我已经在所有页面上设置了一个规范的 https:// URL,所以我认为添加到 .htaccess 并没有多大帮助。

它仍然无法访问我的 styles.css 或下载 google 字体。浏览器也没有在页面 javascript 上正确执行手风琴(它嵌入在页面上多么奇怪!)

我已经联系了 1&1 我的虚拟主机并要求他们确保 .htacess 文件是 'refreshed'...我会去研究 Cloudfare。

快速浏览了您的网站后,您似乎正在使用 Cloudflare(它在您的应用程序服务器前面充当代理*1),在这种情况下,您需要执行类似以下操作,而不是将 HTTP 重定向到 HTTPS:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

您不需要 <IfModule> 包装器。

您应该首先使用 302(临时)重定向进行测试以避免缓存问题,并且只有在确认其按预期工作后才更改为 301(永久)重定向。 301 由浏览器持久缓存,因此会使测试出现问题。

需要在测试前清除浏览器缓存。

这不会规范化 www/non-www 子域。

*1 Cloudflare 在您的应用程序服务器前面充当 front-end SSL 代理。这意味着从客户端到代理的连接是 secure(即在重定向时通过 HTTPS),但从代理到您的应用程序服务器的连接始终是 HTTP。这就是为什么您无法在应用程序服务器本身上检测到 HTTPS 连接并最终获得重定向循环的原因。 X-Forwarded-Proto 是代理的 header set/forwarded 通知 backend/application 服务器客户端使用的协议。


更新: 我注意到虽然上述重定向现在有效,但您仅通过 Cloudflare 发送 www 子域请求。对域顶点(即 example.com)的请求将直接发送到您的原始服务器 (Apache),因此不会被上述规则重定向。

Everything(或nothing)应该通过 Cloudflare 发送,所以这确实是一个 DNS 配置问题。但是,我们可以通过在上述 HTTP 到 HTTPS 重定向之前的 .htaccess 中实现 non-www 到 www 重定向来解决这个问题。 (我假设 www 是首选规范 URL?)

例如:

RewriteEngine On

# Redirect non-www to www (and HTTPS)
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Redirect HTTP to HTTPS (Cloudflare)
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

请注意,之前的规则(HTTP 到 HTTPS)现在排在第二位。

这确实假定您没有其他子域。 IE。仅限 example.comwww.example.com。如果您有其他子域,那么您可能决定要在第一条规则中对域进行硬编码(类似于您之前所做的),例如:

# Redirect non-www to www (and HTTPS) - domain hardcoded
RewriteCond %{HTTP_HOST} =example.com
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]