我有以下配置文件:
文件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,它就会转到下一个文件,如果你不知道它是如何工作的,这会引起有趣的困惑,但一旦你知道了它就很好了。