重写域名和 www.domain letsencrypt 的条件

重写域名和 www.domain letsencrypt 的条件

我有这个虚拟主机/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.comwww.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 Onhttpd 将使用指令中指定的主机名和端口ServerName来构建服务器的规范名称。

使用UseCanonicalName OffApache httpd 将使用主机名和端口形成自引用 URL由客户提供如果提供了的话(否则它将使用如上所述的规范名称)。

如果你希望继续使用mod_rewrite对于此重定向,您有两个选择:

  1. UseCanonicalName On
  2. 直接在规则中使用所需的主机名,例如

    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等等。

相关内容