. htaccess 将 http 重定向到 https

我有一个旧的网址(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文件,使网址自动重定向到 https
谢谢!

303168 次浏览

在.htaccess 文件的末尾添加这段代码

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

2016年最新情况

由于这个答案引起了一些关注,我想提示一种更推荐的使用 Virtual Hosts 的方法: 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 (tion)检查请求的 ServerPort 是否为80(这是默认的 http-port,如果指定了另一个端口,则必须将条件调整到该端口)。如果是这样,我们匹配整个 URL (.*)并将其重定向到 https-url。可以用特定的 URL 替换 %{SERVER_NAME},但是这样就不必为其他项目更改代码。%{REQUEST_URI}是位于 TLD (顶级域)之后的 URL 的一部分,因此您将被重定向到您来自的位置,但是是以 https 的形式。

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

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

我使用以下方法成功地将我的域名的所有页面从 http 重定向到 https:

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

请注意,这将重定向使用 301 'permanently moved'重定向,这将有助于转移您的搜索引擎优化排名。

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

我在重定向方面也有问题。我试了 Stackoverflow 上提出的所有方案。我自己发现的一个案例是:

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

如果 HTTPS/SSL 连接在负载均衡器处结束,并且所有的流量都发送到端口80上的实例,那么下面的规则可以重定向不安全的流量。

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

确保加载了 mod_rewrite模块。

这是最好的 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

在寻找重定向的最佳方法时,我发现了以下内容(来自 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年帮助某人! :)

在.htaccess 顶部添加以下内容

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

将这段代码插入到.htaccess 文件中,应该就可以工作了

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

使用 .htaccess文件强制 HTTPS

= = > 重定向所有网络流量:-

若要强制所有网络流量使用 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 另外,您需要将 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 的名称和文件夹。

domainname.com代替你的域名,它和我一起工作。

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

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

这包括案例 客户端 < http > 代理 < https > webserver

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

这就是我最后的成果

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>