如何在Apache服务器上自动将HTTP重定向到HTTPS?

260
我正在尝试设置自动从HTTP重定向到HTTPS。
From manage.mydomain.com --- To ---> https://manage.mydomain.com

我尝试将以下内容添加到我的httpd.conf文件中,但没有起作用:
 RewriteEngine on
    ReWriteCond %{SERVER_PORT} !^443$
    RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R,L]

怎么修复它?
环境:CentOSApache
13个回答

302

我实际上按照这个例子操作过,结果成功了 :)

NameVirtualHost *:80
<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>

接着执行:

/etc/init.d/httpd restart


7
请注意,仅当您可以访问VirtualHost文件时才可用。这是推荐的方法。 - The Thirsty Ape
4
在 httpd.conf 文件中修改后,重新启动 Apache Web 服务器,以便反映更改并清除浏览器缓存。 - Suriyan Suresh
2
我想报告这种方法在Ubuntu 12.4上对我无效,但是所提出的RewriteEngine解决了问题。 - Deano
5
需要重新启动吗?重新加载配置文件会更加安全,不会造成太大影响。使用命令 /etc/init.d/httpd reload 或者 service httpd reload 进行重新加载。 - Rebecca Dessonville
4
由于目的是将其重定向到 SSL 模式,因此不再需要 DocumentRoot /usr/local/apache2/htdocs 这行代码。 - Abel Callejo
显示剩余9条评论

216

3
这个方案比已批准的方案更好,因为它即使在使用 SSL 解密装置(如 Pound 或 BigIP)时也能正常工作。这些解密装置通常会将所有流量传递到同一端口,而已批准的方案在这种特殊情况下无法正常工作。 - spiritoo
4
@spiritoo 不是这样。Apache文档明确指出,这是那种情况之一,你不应该使用mod_rewrite,而应该使用Redirect:https://httpd.apache.org/docs/2.4/rewrite/avoid.html - Luke Madhanga
5
@LukeMadhanga Apache文档建议使用Redirect来提高性能。但是,从更通用的角度来看,RewriteEngine解决方案更好,因为它甚至适用于我所描述的情况(卸载)。我的评论旨在为每个用户提供选择两个答案之间的关键。有些人需要通用程序(大公司),而有些人需要性能...这是自由选择。 - spiritoo
25
很好,不过如果你想让它更好,就加上这个[R=302,L,QSA],这样任何参数也会被传递到安全页面。它应该看起来像这样: %{REQUEST_URI} [R=302,L,QSA] - Svetoslav Marinov
2
@SvetoslavMarinov 这个评论 意味着,“在这种情况下,当重写的URL中没有?时,在使用[R]时会自动添加[QSA],因此在这里是多余的”。 - Volker E.
显示剩余7条评论

139
我搜索了"apache redirect http to https"并来到了这里。以下是我在Ubuntu上的操作步骤:

1) 启用模块

sudo a2enmod rewrite
sudo a2enmod ssl

2) 编辑您的网站配置

编辑文件

/etc/apache2/sites-available/000-default.conf

内容应为:

<VirtualHost *:80>
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>

<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile    <path to your certificate file>
    SSLCertificateKeyFile   <path to your private key file>

    # Rest of your site configuration
    # ...
</VirtualHost>

请注意,SSL模块需要一个证书。您需要指定一个现有的证书(如果您购买了一个)或者自己生成一个自签名证书

3)重新启动Apache

sudo service apache2 restart

使用Ubuntu 16.04和Apache2进行工作。谢谢! - Sylvester Yao
将IP地址重定向从http://myipaddress到https://myipaddress已经生效。谢谢。 - NomanJaved
1
这个解决方案在你有一些非标准配置时更加健壮。谢谢! - Milan Babuškov
这个解决方案对我有效(Apache/2.4.41 + Ubuntu 20.04.3),但我得到了HTTP状态码302。如何获取状态码301? - thd
在 Debian 11 上运行良好,谢谢。 - elbarna

17
使用mod_rewrite并不是推荐的方式。相反,使用虚拟主机和重定向。

如果你倾向于使用mod_rewrite的话:

RewriteEngine On
# This will enable the Rewrite capabilities

RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS

RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
# This rule will redirect users from their original location, to the same 
location but using HTTPS.
# I.e., http://www.example.com/foo/ to https://www.example.com/foo/
# The leading slash is made optional so that this will work either in
# httpd.conf or .htaccess context

参考:Httpd Wiki - RewriteHTTPToHTTPS 如果您正在寻找一个301永久重定向,那么重定向标志应该是这样的,
 R=301

所以RewriteRule将会是这样的,
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L]

14
我需要这个东西来简单地将服务器上默认的Apache首页的所有HTTP流量重定向到通过HTTPS提供的页面。
由于我在配置Apache方面还相对新手,所以我更倾向于避免直接使用mod_rewrite,而是选择了更简单的方法,就像这样:
<VirtualHost *:80>
  <Location "/">
     Redirect permanent "https://%{HTTP_HOST}%{REQUEST_URI}"
  </Location>
</VirtualHost>

<VirtualHost *:443>
  DocumentRoot "/var/www/html"
  SSLEngine on
  ...
</VirtualHost>

我喜欢这个的原因是它允许我使用Apache变量。这样,我就不需要指定实际的主机名,因为它只是一个没有关联域名的IP地址。
参考资料: 在目标中使用RedirectMatch和HTTP_HOST

1
我收到了这个错误:ERR_INVALID_REDIRECT。看起来这里的参数没有被定义。 - mahyard
2
对我来说很有效,正是我所寻找的,因为我不想在Apache 2.4.38中使用ModRewrite。唯一的区别是,我使用了<Location />,因为那里不需要引号。(没有测试过带引号的情况。) - Tino
我也遇到了ERR_INVALID_REDIRECT,因为它重定向到字面字符串 https://%{HTTP_HOST}%{REQUEST_URI} - bfontaine
@bfontaine,你的Apache服务器是否在代理后面运行?如果HTTP_HOST没有被扩展,那么很可能是因为服务器没有看到请求中的Host:头。 - smac89
1
注意:如果您有多个虚拟主机,我建议使用SERVER_NAME而不是HTTP_HOST!否则,您会重写为IP并且失去查询的主机名。我花了几个小时来弄清楚为什么Apache调用了错误的主机... - stackoverflowed
@stackoverflowed 不错的提示。 SERVER_NAME 必须在服务器上手动配置,但在处理多个虚拟主机时,这似乎是一个可靠的替代方案。 - smac89

13
实际上,你的问题应该属于Server Fault,但你仍然可以尝试检查这些.htaccess指令:
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*) https://%{HTTP_HOST}/$1

11
如果您使用的是Apache 2.4版本,请查看文件000-default.conf。删除DocumentRoot并添加以下内容:
Redirect permanent / https://[your-domain]/

7

服务器版本:Apache/2.4.29(Ubuntu)

在网上和Apache官方文档中进行了长时间的搜索后,唯一有效的解决方案来自于/usr/share/doc/apache2/README.Debian.gz

To enable SSL, type (as user root):

    a2ensite default-ssl
    a2enmod ssl

在文件/etc/apache2/sites-available/000-default.conf中添加以下内容:

重定向“/”“https://sub.domain.com/

请注意,此处使用的是中文引号和英文引号混合。
<VirtualHost *:80>

    #ServerName www.example.com
    DocumentRoot /var/www/owncloud
    Redirect "/" "https://sub.domain.com/"

好的。


附加说明:如果您不想提取文件,可以阅读手册:

gunzip -cd /usr/share/doc/apache2/README.Debian.gz

或者稍微少打一些字,更容易记住;在不解压的情况下阅读自述文件:zcat /usr/share/doc/apache2/README.Debian.gz - Jeremy Davis
1
@JeremyDavis 是的,或者甚至可以使用zless /usr/share/doc/apache2/README.Debian.gz(而不是zcat),这样你可以在终端会话中滚动查看,而无需全部打印出来。 - mwfearnley
1
@mwfearnley - 好主意!:) - Jeremy Davis

6
这段代码对我有用。
# ----------port 80----------
RewriteEngine on
# redirect http non-www to https www
RewriteCond %{HTTPS} off
RewriteCond %{SERVER_NAME} =example.com
RewriteRule ^ https://www.%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]

# redirect http www to https www
RewriteCond %{HTTPS} off
RewriteCond %{SERVER_NAME} =www.example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]

# ----------port 443----------
RewriteEngine on
# redirect https non-www to https www
RewriteCond %{SERVER_NAME} !^www\.(.*)$ [NC]
RewriteRule ^ https://www.%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]


5

对我来说这很有效

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接