.htaccess—“http://www.htaccess.htm/;“重定向太多”;当试图强制使用https时

.htaccess—“http://www.htaccess.htm/;“重定向太多”;当试图强制使用https时,.htaccess,redirect,mod-rewrite,.htaccess,Redirect,Mod Rewrite,我试图强制根域的子文件夹(/bbb/)始终显示为https。另外,我的.htaccess文件负责页面的扩展名 我已经将.htaccess文件放在我的/bbb/文件夹中,但是当我试图强制连接到https时,我得到了“太多重定向”,没有它一切都正常 我的代码有什么问题 Options +FollowSymLinks -MultiViews Options +Indexes AcceptPathInfo Off RewriteEngine on RewriteBase / ErrorDocume

我试图强制根域的子文件夹(/bbb/)始终显示为https。另外,我的
.htaccess
文件负责页面的扩展名

我已经将
.htaccess
文件放在我的
/bbb/
文件夹中,但是当我试图强制连接到https时,我得到了“太多重定向”,没有它一切都正常

我的代码有什么问题

Options +FollowSymLinks -MultiViews
Options +Indexes
AcceptPathInfo Off
RewriteEngine on
RewriteBase   /

ErrorDocument 404 https://example.co.uk/404page/404.html

#Force from http to https
RewriteCond %{SERVER_PORT} 80 
RewriteCond %{HTTP_HOST} !^bbb.example.co.uk/$
RewriteRule ^(.*)$ https://bbb.example.co.uk/$1 [R=301]

#take off index.html
 RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{REQUEST_URI} ^(.*/)index\.html$ [NC]
RewriteRule . http://www.%{HTTP_HOST}%1 [R=301,NE,L]

## hide .php extension
# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R,L,NC]

## To internally redirect /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [L]    

## hide .html extension
# To externally redirect /dir/foo.html to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.html [NC]
RewriteRule ^ %1 [R,L,NC]

## To internally redirect /dir/foo to /dir/foo.html
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^ %{REQUEST_URI}.html [L]

问题在于这条规则:

#Force from http to https
RewriteCond %{SERVER_PORT} 80 
RewriteCond %{HTTP_HOST} !^bbb.example.co.uk/$
RewriteRule ^(.*)$ https://bbb.example.co.uk/$1 [R=301]
将此规则更改为:

#Force from http to https
RewriteCond %{HTTPS} off 
RewriteCond %{HTTP_HOST} =bbb.example.co.uk
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301]
由于使用了
,您的情况发生了逆转在开始处,在结束处有一个额外的斜杠,它将永远不会匹配,因此使您的条件始终返回true

在测试之前,请确保清除浏览器缓存。

尝试以下操作:

RewriteEngine On
RewriteCond %{ENV:HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

如果您有一个代理服务器或使用共享主机,那么有时您可以通过CloudFlare获得免费的SSL。如果您使用的是CodeIgniter或Laravel之类的框架,那么您总是有一个路由文件。因此,有时我上面给出的答案可能不起作用

在这种情况下,当您尝试重定向到
https
时,可能会得到无限循环。为了解决这个问题,您可以尝试以下方法:

RewriteEngine On

# If we receive a forwarded http request from a proxy...
RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR]

# ...or just a plain old http request directly from the client
RewriteCond %{HTTP:X-Forwarded-Proto} =""
RewriteCond %{HTTPS} !=on

# Redirect to https version
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
受answer的启发,我在Cloudflare的WAF背后保护了我的域名。在域的Cloudflare仪表板中,在SSL/TSL选项卡上,我使用了FlexibleSSL/TSL加密设置,即在浏览器和Cloudflare之间对流量进行了加密,但没有与我的服务器完全端到端。此设置中的某些内容导致重定向过多


解决方案是,在不对apache配置或htaccess文件进行任何额外编辑的情况下,将设置更改为“Full”。这会对端到端进行加密,并立即解决重定向问题。

在.htaccess文件中重定向

.htaccess文件是一个配置文件,用于修改网站/服务器上每个目录的Apache服务器行为。这是一个用户级配置文件,虽然重定向是常用的,但这里只能编辑一些Apache配置

您可以有多个.htaccess文件,这些文件级联在一系列目录上。如果父目录中有.htaccess,子目录中有另一个.htaccess,则它们都会影响子目录。在这些情况下,记住您有和没有.htaccess文件的位置非常重要,以防止不同级别的.htaccess文件之间发生冲突

下面是一系列重定向示例,有助于识别.htaccess文件中的重定向。这些并不是执行此类重定向的唯一方法,但是它们应该向您展示最常见的重定向是什么样子的,这样您就可以在使用.htaccess文件时识别它们

强制HTTPS 下面的.htaccess代码首先检查请求是否使用HTTP或HTTPS进入服务器。如果请求未使用HTTPS,则配置将告诉浏览器重定向到以前请求的相同网站和URL的HTTPS版本

RewriteEngine On
 RewriteCond %{HTTPS} off
 RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
在负载平衡器或代理(CloudFlare/Incapsula/Sucuri/etc)后面强制使用HTTPS: 有时您可能使用代理,如负载平衡器或web防火墙,如CloudFlare、Incapsula或Sucuri。这些可以配置为在前端使用SSL,但在后端不使用SSL。要使其正常工作,您不仅需要检查请求中的HTTPS,还需要检查代理是否仅使用HTTP将原始HTTPS请求传递给服务器。以下规则检查请求是否是从HTTPS转发的,如果是,则不尝试重定向额外的时间

RewriteEngine On
 RewriteCond %{HTTPS} off
 RewriteCond %{HTTP:X-Forwarded-Proto} =http
 RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
强制非www 此重定向仅检查域名开头是否使用www请求了网站名。如果包含www,它将重写请求并告诉浏览器重定向到域名的非www版本

RewriteEngine On
 RewriteCond %{HTTP_HOST} ^www\. [NC]
 RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
强制www 最后一个重定向检查域名开头是否未使用www请求网站名。如果不包括www,它将重写请求并告诉浏览器重定向到域的www版本

RewriteEngine On
 RewriteCond %{HTTP_HOST} !^www\. [NC]
 RewriteRule (.*) http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

谢谢,但还是说“重定向太多了”。。我刷新了缓存,完全相同的规则在我的Apache上运行良好。您是否支持Apache并且
%{SERVER\u PORT}
在那里工作正常?我不支持我的服务器,但服务器提供商one.comHTTP\u主机只包含主机名。您的
bbb.example.co.uk/
将永远不会匹配,因为
/
不是主机名的有效部分。更多关于
%{ENV:HTTPS}
的赞扬!不知道为什么或如何,但似乎是唯一的规则,为我的设置工作!如上所述-客户端奇怪的托管包,这是唯一有效的规则是的,有效…但为什么?!?在过去一年左右的时间里,我们已经将许多客户端切换到HTTPS,但这是我不得不求助于此的第一个实例…这对我来说不起作用:-(这可能是我将以下内容放在
指令中而不是
.htaccess
中的原因吗?
RewriteCond%{ENV:HTTPS}!RewriteCond%{HTTPS}!关于RewriteRule^(.*)$https://%{HTTP_HOST}%{REQUEST_URI}[L,R=301]
所以我们说,
RewriteCond%{SERVER_PORT}80
不起作用,它似乎甚至与https连接相匹配,而
RewriteCond%{ENV:https}!on
工作正常。接受的答案被接受,因为它修复了OP的打字错误,但这是真正有用的答案这帮我搞定了!显然CloudFlare在重定向方面弄乱了一些东西。在尝试了几乎所有的方法后,这只起作用了!!非常感谢:)这里也一样,当我尝试使用任何其他方法强制使用https时,CloudFlare以某种方式导致了重定向循环。很好的解决方案@harshal lonareAwesome,似乎云Flare代理是导致无限重定向的问题,非常感谢!
RewriteEngine On
 RewriteCond %{HTTP_HOST} !^www\. [NC]
 RewriteRule (.*) http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]