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

Все домены должны быть на сертификате SSL при канонизации доменов через 301 перенаправление с HTTP на HTTPS в Apache?

У меня есть несколько доменов, указывающих на один и тот же сервер. Только один из этих доменов (основной) действительно включен в мой SSL-сертификат. Я включил в свой httpd.conf файл в течение некоторого времени, поэтому все они постоянно перенаправляют на один домен.

RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com$1 [R=301,L]

Предполагается, что все домены ДОЛЖНЫ 301 перенаправлять на www.example.com как HTTPS. Однако недавно я заметил, что эти перенаправления происходят - но как перенаправление 302. Я попробовал проверить работоспособность Вот и, похоже, он работает так, как я ожидал.

Итак, резюмируем:

Что случается: http://sub1.example.com приводит к перенаправлению 302 на https://www.example.com.

Что должно произойти: http://sub1.example.com приводит к перенаправлению 301 на https://www.example.com.

Мой вопрос: все домены должны быть указаны в сертификате SSL, чтобы такое перенаправление произошло как 301? Я здесь просто тяну за соломинку.

Просто для полноты, вот заголовки запроса / ответа начальной страницы и целевой страницы, когда это происходит.

Заголовок запроса для начальной страницы (sub1.example.com):

GET / HTTP/1.1
Host: sub1.example.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8

Заголовок ответа для начальной страницы (sub1.example.com):

HTTP/1.1 302 Found
Date: Wed, 04 Oct 2017 21:05:16 GMT
Server: Apache
Location: https://www.example.com/
Cache-Control: max-age=1
Expires: Wed, 04 Oct 2017 21:05:18 GMT
Content-Length: 212
Keep-Alive: timeout=5, max=150
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

Заголовок запроса для целевой страницы (www.example.com):

GET / HTTP/1.1
Host: www.example.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8
Cookie: <redacted>

Заголовок ответа для целевой страницы (www.example.com):

HTTP/1.1 200 OK
Date: Wed, 04 Oct 2017 21:05:16 GMT
Server: Apache
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Vary: Accept-Encoding
Content-Encoding: gzip
Keep-Alive: timeout=5, max=150
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

Если вы видите перенаправление 302, то может показаться, что это перенаправление в конечном итоге запускает что-то еще. Опубликованный вами код, если он выполняется, явно имеет код 301.

должны ли все домены быть указаны в сертификате SSL, чтобы такое перенаправление произошло как 301?

Нет, если вы только перенаправляете из HTTP - как кажется на ваших примерах.

Если бы другие ваши домены не были указаны в сертификате SSL, вы, очевидно, столкнулись бы с проблемами при попытке перенаправить с https://otherdomain.com/..., поскольку запрос никогда не достигнет вашего сервера (если пользователь не принял недопустимый сертификат).