通过.htaccess将HTTP转换为https


68

我已经看过现有的问题,但实际上并没有遇到任何对我有用的东西。

我目前正在运行带有安全SSL证书的网站。可以在https://www.example.co.uk上访问它,但有一个问题是可以在http://www.example.co.uk上访问该站点-我不希望这样。我需要它从http重定向到https。

我发现在.htaccess文件中使用此代码段。

Options +FollowSymLinks 
RewriteEngine on 
RewriteCond %{HTTP_HOST} ^example.co.uk [NC] 
RewriteRule ^(.*)$ https://example.co.uk/$1 [L,R=301]

当用户在其地址栏中输入example.co.uk时,此方法很好用,但是我还需要添加某种条件语句,以便用户输入“ www.example.co.uk”或“ http:// www.example.co.uk '。

我尝试使用[OR]之类的方法,但这最终会导致服务器错误。

任何帮助和建议,表示赞赏。

干杯。


Answers:


174

请尝试以下操作:

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

另外,您还可以根据端口号进行重定向,例如:

 RewriteCond %{SERVER_PORT} ^80$
 RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

这会将在端口80上收到的所有请求重定向到HTTPS。


1
非常感谢@BluesRockAddict-好东西。工作请客!
fitzilla

2
谢谢!从http://迁移(使用.htaccess文件)到https://(一旦获得SSL证书)的最简单方法
Adrian Tanase 2013年

为了澄清起见,您是填写SERVER_NAME还是保留原样?
AlxVallejo 2014年

@AlxVallejo SERVER_NAME保持原样,它是一个Mod_Rewrite变量: askapache.com/htaccess/mod_rewrite-variables-cheatsheet.html
salonMonsters 2014年

5
为什么一个使用[R,L]vs另一个使用[R=301,L]
RedYetiCo's


5

试试这个,我用它,它工作正常

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}


3

我尝试了所有上述代码,但任何代码均不适用于我的网站。然后,我尝试了此代码,并且此代码对我的网站运行得非常完美。您可以在htaccess中使用以下规则:

<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On

//Redirect http to https
RewriteCond %{SERVER_PORT} 80
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

//Redirect non-www to www
RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]

</IfModule>

用您的域名更改example.com,对不起,我的英语不好。



2
# Switch rewrite engine off in case this was installed under HostPay.
RewriteEngine Off

SetEnv DEFAULT_PHP_VERSION 7

DirectoryIndex index.cgi index.php

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

# RewriteCond %{HTTP_HOST} ^compasscommunity.co.uk\.com$ [NC]
# RewriteRule ^(.*)$ https://www.compasscommunity.co.uk/$1 [L,R=301]

因此,URL中的www不会转到https版本,当我添加建议的代码时,我得到的消息是您重定向了太多次了?非常感激任何的帮助。
罗盘

这看起来不是正确的答案。因此,请解释一下为什么您认为关闭重写引擎会有所帮助?
sr9yar

找到了解决方案,删除了htaccess文件中的重定向,并运行了非常简单的ssl插件
Compass,

1

要重定向http://example.com http://www.example.com https://www.example.com一种简单的方式,您可以在htaccess中使用以下规则:

RewriteEngine on

RewriteCond %{HTTPS} off
RewriteCond www.%{HTTP_HOST} ^(?:www\.)?(www\..+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [NE,L,R]

[已测试]

%{REQUEST_SCHEME}变量自apache 2.4起可用,此变量包含请求的方案的值(http或https),在apache 2.4上,您可以使用以下规则:

RewriteEngine on


RewriteCond %{REQUEST_SCHEME} ^http$
RewriteCond %{HTTP_HOST} ^(www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [NE,L,R]

1

有更好和更安全的方法来确保您的所有流量都通过https。例如,设置两个虚拟主机并将所有流量从您重定向http到您的https主机。有关更多信息,请访问security.stackexchange.com上的此答案

通过设置虚拟主机进行重定向,您可以发送301状态(永久重定向),以便浏览器了解以下所有请求都应发送到重定向到的https服务器。因此,在第一个重定向响应之后将不再发出其他http请求。

您还应该仔细检查给出的答案,因为如果设置了错误的重写规则,则可能会使传入请求中的查询参数丢失。


1

如果要将HTTP重定向到HTTPS并想在每个URL中添加www,请使用下面的htaccess

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

它将首先将HTTP重定向到HTTPS,然后将其重定向到www。


1

由于这是搜索中最热门的结果之一,因此,如果您尝试在AWS beantalk上将http添加到https重定向中,则接受的解决方案将不起作用。您需要以下代码:

RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^.*$ https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

1

尝试这个 RewriteCond %{HTTP_HOST} !^www. [NC] RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]


您能给教育部解释您的代码吗?
JSmith

1

完美代码转到HTML索引:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^YourNameWebsite\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.YourNameWebsite\.com$
RewriteRule ^/?$ "https\:\/\/YourNameWebsite\.com\/index\.html" [R=301,L]

要么

完美代码转到PHP索引:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^YourNameWebsite\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.YourNameWebsite\.com$
RewriteRule ^/?$ "https\:\/\/YourNameWebsite\.com\/index\.php" [R=301,L]

0

除了这些,这些都不对我有用。我的网站托管在https://www.asmallorange.com

RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteCond %{SERVER_PORT} !^443$
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

0

以下代码添加到.htaccess文件中后,会将自动发送到http:的所有流量重定向到https:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>

如果您的项目在Laravel两行中

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

就在下面RewriteEngine On。最后,您的.htaccess文件将如下所示。

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

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

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

访问此处了解更多信息


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.