我有这个虚拟主机/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>
letsencrypt 已添加这些行Rewrite*
,我在 google 上查了一下,这似乎是个好办法。但当我访问时,它domain.com
并没有将我重定向到(它会加载 000-default.conf)。尽管如此,当我继续访问时,https://example.com
它会将我重定向到https://www.example.com
www.example.com
你知道吗?我不知道如何调试。日志证实了我所说的话,当我继续时,cv_access.log 不会打印任何请求domain.com
。
答案1
我们来看看这一行:
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
这里,%{SERVER_NAME}
变量取决于UseCanonicalName
,默认设置为Off
。因此,变量具有Host:
header 的内容,而不是 中指定的内容ServerName
。
Apache
UseCanonicalName On
httpd 将使用指令中指定的主机名和端口ServerName
来构建服务器的规范名称。使用
UseCanonicalName Off
Apache httpd 将使用主机名和端口形成自引用 URL由客户提供如果提供了的话(否则它将使用如上所述的规范名称)。
如果你希望继续使用mod_rewrite对于此重定向,您有两个选择:
- 放
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
等等。