为什么我的 .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]
- 它现在阻止加载我的 google 字体和 styles.css。
真的很重要!
- 它也无法重定向。
非常感谢解决方案和解释。
好的,感谢 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.com
和 www.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]
哦天啊,我已经尝试过一百万次,一百万种不同的方式使用 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]
- 它现在阻止加载我的 google 字体和 styles.css。 真的很重要!
- 它也无法重定向。
非常感谢解决方案和解释。
好的,感谢 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.com
和 www.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]