我有一个网站,可以通过在 Web 浏览器中输入多个不同的 URL 来访问。以下所有情况也适用(将通过https
协议加载):
lamtakam.com
https://lamtakam.com
https://www.lamtakam.com
http://lamtakam.com -- automatically will be redirected to https which is correct
好了,现在一切都很好了。唯一的问题是这个 URL:
http://www.lamtakam.com
http
它将通过(而非)协议加载https
。我如何才能让它https
也重定向到协议?
我的服务器使用 Linux ubuntu 作为操作系统,使用 apache 作为 Web 服务器。
编辑:以下是文件内容/etc/apache2/sites-available/000-default.conf
:
#ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/myweb
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
RewriteEngine on
RewriteCond %{SERVER_NAME} =lamtakam.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
<Directory /var/www/html/myweb>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
答案1
问题在于何时进行重写。它设置为仅精确匹配裸域(= lamtakam.com
),而不匹配www.
重写条件中的子域。
尝试使用它来重写条件和规则:
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^(www\.)?lamtakam\.com$
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [END,NE,R=permanent]
...然后重新启动 Apache,看看站点重定向是否现在发生。不过,请先小心地刻录浏览器缓存,这样您就不会遇到之前缓存的页面数据的问题。
这与您的配置设置不同:
- 要求 HTTPS 未开启(即请求已开启,
http://
但未开启https://
),并且 - 要求请求的主机名/域与指定的正则表达式匹配(与 和 都匹配
www.lamtakam.com
)lamtakam.com
,并且 HTTP_HOST
是否使用 的值而不是的值进行重写SERVER_NAME
,以保持域相同。%{SERVER_NAME}
如果您愿意(或者您的站点需要这样做),您可以将其更改为重写规则,但我更喜欢在 中使用最初请求的主机名HTTP_HOST
。
请注意,我建议使用,%{HTTP_HOST}
以便您匹配实际请求的主机名,而不是 Apache 存储的“服务器名称”。
(此答案改编自RewriteCond %{SERVER_NAME} 语法经过斯塔基恩在 StackOverflow 上)