.htaccess - "太多的重定向"当试图强制https

时间:2016-04-20 15:13:00

标签: .htaccess redirect mod-rewrite

我正在尝试强制我的根域的子文件夹(/ bbb /)始终显示为https。我的.htaccess文件也会处理页面的扩展名。

我已将.htaccess文件放在我的/bbb/文件夹中,但我得到了#34;太多的重定向"当我试图强制连接到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]

6 个答案:

答案 0 :(得分:32)

试试这个:

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

答案 1 :(得分:9)

如果您使用代理服务器或使用共享主机,则有时您选择通过CloudFlare获取免费的SSL。而且,如果您使用的是诸如codeigniter或laravel之类的框架,那么您始终会有一个路由文件。因此,有时我上面给出的答案可能无效。

在这种情况下,当您尝试重定向到htpps时,可能会遇到无限循环。因此,为了解决这个问题,您可以尝试以下操作:

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]

答案 2 :(得分:3)

问题在于此规则:

#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。

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

答案 3 :(得分:0)

RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Add X-Forwarded-Proto condition instead

答案 4 :(得分:0)

this答案的启发,我将自己的域名保护在Cloudflare的WAF之后。在域的Cloudflare仪表板中, SSL / TSL 选项卡上,我正在使用 Flexible SSL / TSL加密设置,即在浏览器和cloudflare之间对流量进行了加密,但没有与我的服务器完全端对端。此设置中的某些内容导致了过多的重定向。

不对我的apache配置或htaccess文件进行任何其他编辑的解决方案是将设置更改为“ 完整”。这样可以端到端加密并立即解决重定向问题。

答案 5 :(得分:0)

.htaccess文件中的重定向

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

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

下面是一系列重定向示例,它们将帮助您识别.htaccess文件中的重定向。这些不是执行此类重定向的唯一方法,但它们应该向您展示最常见的重定向的外观,以便在它们位于正在使用的.htaccess文件中时识别出它们。

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

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

强制HTTPS:在负载均衡器或代理(CloudFlare / Incapsula / Sucuri /等)之后 有时您可能正在使用代理,例如负载平衡器或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]