Назад | Перейти на главную страницу

Rewritecond для домена и 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.

Взглянем на эту строку:

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 и т.п.