重写cond域名和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> 

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 On Apache httpd上将使用ServerName指令中指定的主机名和端口来构造服务器的规范名称。

使用UseCanonicalName Off Apache httpd将使用由客户端提供的主机名和端口(如果提供的话,将使用上面定义的规范名称)形成自引用URL。

如果你喜欢继续使用mod_rewrite进行redirect,你有两个select:

  1. UseCanonicalName On设置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等。