.htaccess将http重定向到https


83

我有一个旧的url(www1.test.net),我想将其重定向到https://www1.test.net
我已在自己的网站上实现并安装SSL证书的位置。
这是我的旧文件.htaccess

RewriteEngine On
RewriteRule !\.(js|gif|jpg|png|css|txt)$ public/index.php [L]
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(.*)$ public/$1 [L]

如何配置我的.htaccess文件,以便url自动重定向到https
谢谢!


如果第二行是为了不做重定向,如果路径指向一个实际的文件(和您列出的预期可能的扩展),你可以使其更加灵活的与现有文件进行检查替换它:RewriteCond %{REQUEST_FILENAME} !-f 后跟您的重定向。
diamondsea

Answers:


112

更新2016

当这个答案受到关注时,我想提示使用虚拟主机执行此操作的一种更推荐的方法:Apache:重定向SSL

<VirtualHost *:80>
   ServerName mysite.example.com
   Redirect permanent / https://mysite.example.com/
</VirtualHost>

<VirtualHost _default_:443>
   ServerName mysite.example.com
   DocumentRoot /usr/local/apache2/htdocs
   SSLEngine On
# etc...
</VirtualHost>

旧的答案, 考虑到您的ssl-port未设置为80,这很棘手

RewriteEngine on

# force ssl
RewriteCond     %{SERVER_PORT} ^80$
RewriteRule     ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

请注意,这应该是您的第一个重写规则。

编辑:此代码执行以下操作。RewriteCond(ition)检查请求的ServerPort是否为80(这是默认的http端口,如果指定了其他端口,则必须将条件调整为80)。如果是这样,我们将匹配整个URL(.*)并将其重定向到https-URL。%{SERVER_NAME}可以用一个特定的URL代替,但是用这种方法,您不必更改其他项目的代码。%{REQUEST_URI}是网址中顶级域名(TLD)(顶级域)之后的部分,因此您将被重定向到您的来源,但以https的形式重定向。


1
谢谢谢谢...它的工作...:d但是,你能解释为什么它的工作...谢谢... ^^?
班禅TRAN

1
很高兴它对你有效。检查更新的答案以获取有关代码的解释。这对您足够了吗?
Jojo 2012年

1
“请注意,这应该是您的第一个重写规则。” @Jojo救了我一命的人:*
Ivan Shulev

1
要补充说明。“ [[[L]标志](httpd.apache.org/docs/2.4/rewrite/flags.html#flag_l)使mod_rewrite停止处理规则集。通常,您只想默认添加即可。“使用[[R]标志](httpd.apache.org/docs/2.4/rewrite/flags.html#flag_r)导致向浏览器发出HTTP重定向。” 如果不存在,重定向将是内部的,这将使使用HTTPS的含义无效。默认情况下,发出的重定向状态为302(临时重定向)。如果您希望浏览器(“永久”)缓存新的URL,请[R=301]改用。
雅尼斯·埃默里斯(JānisElmeris)'18

1
对于VirtualHost解决方案,不清楚在复杂的安装情况下应在何处放置“重定向永久”语句。我假设接近顶部,并且有效。
eyal_katz

170

我使用以下命令成功地将域中的所有页面从http重定向到https:

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

请注意,这将使用重定向进行301 'permanently moved'重定向,这将有助于转移您的SEO排名。

使用302 'temporarily moved'更改进行重定向[R=302,L]


5
这比“ hacky”接受的答案更合适
am05mhz16年

7
在某些情况下,需要X-Forwarded-Proto RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
Kuzeko '16

1
到目前为止,这里的答案更好

这在Godaddy服务器中为我工作。@布拉德利太好了!!
vishnu

在各种服务器环境和站点设置下,这对我来说都是有效的。应该是推荐的答案恕我直言。
John Contarino

57

这对于www和https,代理而不是代理用户来说是最佳选择。

RewriteEngine On

### WWW & HTTPS

# ensure www.
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# ensure https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

### WWW & HTTPS

1
如何重定向到非www?
Elyor

对于那些%{HTTPS} off不够的人,这是迄今为止的最佳答案
NoodleOfDeath '19

10

我用以下代码强制使用https:

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

1
@Niby请检查我的回答日期和“已经存在的答案”。
阿尔达(Arda)

6

如果HTTPS / SSL连接在负载均衡器处终止并且所有流量都发送到端口80上的实例,则以下规则适用于重定向非安全流量。

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

确保mod_rewrite模块已加载。


4

搜索最佳的重定向方式,我发现了这一点(来自html5boilerplate):

# ----------------------------------------------------------------------
# | HTTP Strict Transport Security (HSTS)                              |
# ----------------------------------------------------------------------

# Force client-side SSL redirection.
#
# If a user types `example.com` in their browser, even if the server
# redirects them to the secure version of the website, that still leaves
# a window of opportunity (the initial HTTP connection) for an attacker
# to downgrade or redirect the request.
#
# The following header ensures that browser will ONLY connect to your
# server via HTTPS, regardless of what the users type in the browser's
# address bar.
#
# (!) Remove the `includeSubDomains` optional directive if the website's
# subdomains are not using HTTPS.
#
# http://www.html5rocks.com/en/tutorials/security/transport-layer-security/
# https://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-14#section-6.1
# http://blogs.msdn.com/b/ieinternals/archive/2014/08/18/hsts-strict-transport-security-attacks-mitigations-deployment-https.aspx

Header set Strict-Transport-Security "max-age=16070400; includeSubDomains"

也许它将在2017年帮助某人!:)


在2017年,这应该是公认的答案。但是它应包含该内容以通过.htacces文件启用HSTS(问题已为此标签),您必须省略IfModule标签。如果您使用自己的答案来编辑答案,我很乐意从接受的答案链接到此处
Jojo

你好,Jojo!很抱歉得到这个较晚的答案,您的意思是同时删除# <IfModule mod_headers.c># </IfModule>
LIIT

嘿,LIIT,是的,这就是我的意思。
Jojo

1
虽然这很好,并且确实有助于实现或支持(可能)所需的效果,但这不会将http请求重定向到https,因此也无法回答问题。仅当客户端已经通过HTTPS(在指定的最大使用时间间隔内)访问站点时,它才起作用。因此,应始终伴随适当的重定向。
Nicolai Ehemann '18年

4

将此代码插入您的.htaccess文件。它应该工作

RewriteCond %{HTTP_HOST} yourDomainName\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://yourDomainName.com/$1 [R,L]

2

在您的.htaccess文件末尾添加此代码

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

1
可能是因为未在此答案中像在其他答案中一样启用mod_rewrite。
keji

只需添加RewriteEngine on至此即可使其工作。
Giacomo1968

2

将以下内容添加到.htaccess的顶部

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

1

我也有重定向问题。我尝试了关于Stackoverflow的所有建议。我自己发现的一个案例是:

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP:SSL} !=1 [NC]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

1

这样可以确保重定向对不透明代理的所有组合均有效。

这包括案例客户端<http>代理<https>网络服务器

# behind proxy
RewriteCond %{HTTP:X-FORWARDED-PROTO} ^http$
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]

# plain
RewriteCond %{HTTP:X-FORWARDED-PROTO} ^$
RewriteCond %{REQUEST_SCHEME} ^http$ [NC,OR]
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]

-1

强制使用.htaccess文件的HTTPS

==>重定向所有Web流量:-

要强制所有Web流量使用HTTPS,请.htaccess在网站的根文件夹中的文件中插入以下代码行。

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

==>仅重定向指定的域:-

要强制特定域使用HTTPS,请.htaccess在网站的根文件夹中的文件中使用以下代码行:

RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteEngine On 
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

如果这不起作用,请尝试删除前两行。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

请确保将example.com替换为您要强制使用https的域名。另外,您需要用实际域名替换www.example.com。

==>重定向指定的文件夹:-

如果要在特定文件夹上强制使用SSL,请将以下代码插入到.htaccess该特定文件夹中的文件中:

RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteCond %{REQUEST_URI} folder
RewriteRule ^(.*)$ https://www.example.com/folder/$1 [R=301,L]

确保将文件夹引用更改为实际的文件夹名称。然后,请确保将www.example.com/folder替换为您要强制启用SSL的实际域名和文件夹。


-1

将您的域名替换为domainname.com与我合作的域名。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^domainname\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.domainname.com/$1 [R,L]

2
请不要仅将代码发布为答案,还请提供解释代码的作用以及如何解决问题的方法。带有解释的答案通常更有用,而且质量更高,并且更有可能吸引投票。
Mark Rotteveel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.