Apache 从 http 重定向到 https 不起作用

Apache 从 http 重定向到 https 不起作用

我有以下配置文件:

文件1:

NameVirtualHost  123.45.67.890:80

<VirtualHost 123.45.67.890:80>
    ServerName example.com

    RedirectPermanent / https://example.com/

#   RewriteEngine On
#   RewriteCond %{SERVER_PORT} !^443$
#   RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [L,R]

#   SSLRequireSSL
#   Redirect permanent /secure https://example.com/

#   Redirect / https://example.com/
</VirtualHost>

正如您从注释掉的行中看到的,我尝试了几种方法。

文件2:

NameVirtualHost 123.45.67.890:443

<VirtualHost 123.45.67.890:443>
    DocumentRoot "/opt/www/example-docroot"
    ServerName example.com
    DirectoryIndex index.html
    SSLEngine on

    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
    SSLCertificateFile /etc/httpd/conf.d/ssl/example.com/csr.example.2011.pem.blade
    SSLCertificateKeyFile /etc/httpd/conf.d/ssl/example.com/nokey.example.2011.pem
    SSLCACertificateFile /etc/httpd/conf.d/ssl/example.com/CA.blade.2011.csr

    <Files ~ "\.(cgi|shtml|phtml|php3?)$">
        SSLOptions +StdEnvVars
    </Files>
    <Directory "/etc/httpd/cgi-bin">
        SSLOptions +StdEnvVars
    </Directory>
</VirtualHost>

为了简单起见,删除了一些内容,更改了名称以保护无辜者。

我在服务器 /etc/httpd/vhosts 上更新了这些文件

然后运行

apachectl restart

这确实给了我这些警告:

[warn] NameVirtualHost 123.45.67.890:80 has no VirtualHosts
[warn] NameVirtualHost 123.45.67.890:80 has no VirtualHosts

我们在该服务器上运行了多个虚拟主机。上述配置似乎一致,因此我认为这些警告不适用于此处。也许是错的。

更新浏览器中的默认 80(http)页面,始终显示默认 http 页面。

关于如何使重定向正常工作,有什么建议吗?

答案1

许多示例适用于特定配置。无论您的 Apache 服务器使用哪种配置,此示例始终有效:

RewriteEngine On
RewriteCond %{SERVER_PORT} !443
RewriteRule ^(/(.*))?$ https://%{HTTP_HOST}/$1 [R=301,L]

答案2

几天前我也遇到过同样的问题。我在 apache httpd.conf 文件中的 VirtualHost 配置(适用于 http 端口 80)中尝试了以下操作,成功了。

<Virtualhost *:80>
ServerAdmin [email protected]
ServerName site.com
ServerAlias site.com www.site.com

RedirectMatch permanent ^(.*)$ https://www.site.com$1
</Virtualhost>

这非常有效,您不需要在其他地方进行任何配置或任何额外的模块。

答案3

最好使用.htaccess它(如果可能的话),不需要弄乱 apache 配置文件。将这些行添加到.htaccess.

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

答案4

我们的问题是配置文件优先。简而言之,HTTP VirtualHost000-default.conf覆盖了我们在自己的配置文件中创建的设置。

对于那些知道“默认”一词含义的人来说,这很令人困惑,默认是指只有在其他地方没有定义的情况下才会使用。我们愚蠢地认为,只有000-default.conf在其他配置文件中没有定义的情况下才会提供配置。

我们错了。Apache 只是根据文件名的字母数字顺序使用它遇到的第一个文件中的配置。如果它在该文件中找不到匹配的 VirtualHost,它就会转到下一个文件,如果你不知道它是如何工作的,这会引起有趣的困惑,但一旦你知道了它就很好了。

相关内容