.htaccess将http重定向到https

时间:2012-11-14 09:36:38

标签: apache .htaccess

我有一个旧网址(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? 谢谢!

15 个答案:

答案 0 :(得分:113)

我使用以下命令成功将我的域的所有页面从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]

进行重定向

答案 1 :(得分:93)

2016年更新

由于这个答案得到了一些关注,我想提示一个更推荐的使用虚拟主机的方法:Apache: Redirect 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>

旧答案,hacky事 鉴于您的ssl-port未设置为80,这将起作用:

RewriteEngine on

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

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

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

答案 2 :(得分:38)

这对于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

答案 3 :(得分:6)

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

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

答案 4 :(得分:4)

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

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

确保已加载mod_rewrite模块。

答案 5 :(得分: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年的某个人! :)

答案 6 :(得分:2)

将此代码插入.htaccess文件中。它应该可以工作

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

答案 7 :(得分:1)

我也遇到了重定向问题。我尝试了Stackoverflow上提出的所有内容。我自己发现的一个案例是:

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        return userIdentity;
    }

    ...
    public virtual Group Group { get; set; }
    ...
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext() : base("DefaultConnection", throwIfV1Schema: false) { }

    ...
    public DbSet<Post> Posts { get; set; }
    public DbSet<Group> Groups { get; set; }
    ...

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

public class ApplicationRole : IdentityRole
{
    public ApplicationRole() : base() { }
    public ApplicationRole(string name) : base(name) { }
    public string Description { get; set; }
}

答案 8 :(得分:1)

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

这包括案例客户端代理网络服务器

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

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

在.htaccess的顶部添加以下内容

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

答案 11 :(得分:0)

使用以下代码,或者您可以阅读有关此主题的更多详细信息。 How to redirect HTTP to HTTPS Using .htaccess?

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

答案 12 :(得分:0)

这就是最终为我工作的原因

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

答案 13 :(得分:-1)

使用.htaccess文件强制HTTPS

==>重定向所有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的名称和文件夹。

答案 14 :(得分:-1)

domainname.com替换您的域,它正在与我合作。

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