Перепишите 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, и я проверил на Google, кажется, это хороший способ сделать это. Но когда я иду в domain.com это не перенаправляет меня на https://example.com (загружает 000-default.conf). Тем не менее это перенаправляет меня на 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: заголовок, а не тот, который указан в ServerName,

С UseCanonicalName On Apache httpd будет использовать имя хоста и порт, указанные в ServerName директива для построения канонического имени для сервера.

С UseCanonicalName Off Apache 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 и т.п.

Другие вопросы по тегам