我在/etc/apache2/sites-available/cv.conf有这个虚拟主机
<VirtualHost *:80> ServerName example.com ServerAlias www.example.com DocumentRoot /var/www/cv/web <Directory /var/www/cv/web> AllowOverride All Order Allow,Deny Allow from All </Directory> ErrorLog ${APACHE_LOG_DIR}/cv_error.log CustomLog ${APACHE_LOG_DIR}/cv_access.log combined RewriteEngine on RewriteCond %{SERVER_NAME} =www.example.com [OR] RewriteCond %{SERVER_NAME} =example.com RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] </VirtualHost>
行Rewrite*已经被letsencrypt添加了,我检查了谷歌,这似乎是这样做的好方法。 但是当我去domain.com它不redirect到https://example.com (它加载000-default.conf)。 不过,当我访问www.example.com时,它会将我redirect到https://www.example.com
你有什么主意吗? 我不知道如何debugging。 日志确认我在说什么,当我在domain.com上时,cv_access.log不打印任何请求。
我们来看看这一行:
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
这里, %{SERVER_NAME}variables依赖于UseCanonicalName ,默认情况下设置为Off 。 因此,该variables具有Host:头的内容,而不是ServerName指定的内容。
使用
UseCanonicalName OnApache httpd上将使用ServerName指令中指定的主机名和端口来构造服务器的规范名称。使用
UseCanonicalName OffApache httpd将使用由客户端提供的主机名和端口(如果提供的话,将使用上面定义的规范名称)形成自引用URL。
如果你喜欢继续使用mod_rewrite进行redirect,你有两个select:
UseCanonicalName On设置UseCanonicalName On 。 在规则中直接使用所需的主机名,例如
RewriteRule ^ https://example.com%{REQUEST_URI} [END,NE,R=permanent]
但是,你是过于复杂的东西,因为你可以做同样没有mod_rewrite:
<VirtualHost *:80> ServerName example.com ServerAlias www.example.com Redirect / https://example.com/ </VirtualHost>
在这里, Redirect指令来自mod_alias,你不需要DocumentRoot等。