Перенаправьте ОБА http и www на https://example.com - PullRequest
0 голосов
/ 13 января 2019

Цель состоит в том, чтобы перенаправить ОБА HTTP и www на https://example.com на сервисе общего хостинга с активным SSL.

Несколько попыток; некоторые, включающие правило типа:

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://example.com/$1 [R,L]

и другие попытки, включающие, например, такие правила, как публикация StackOverflow Рахиля Вазира, в которых:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteCond %{SERVER_PORT} !^443
RewriteRule ^(.*)$ http://example.com/$1 [L, R=301]
RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteCond %{SERVER_PORT} ^443
RewriteRule ^(.*)$ https://example.com/$1 [L, R=301]

Пока что ни одна попытка не достигла цели полностью. Вы можете помочь?

Обратите внимание, что https://www.example.com также должен постоянно перенаправлять на https://example.com.

1 Ответ

0 голосов
/ 13 января 2019

Если вы не используете HSTS (в этом случае вы должны реализовать два отдельных перенаправления, первое из которых - HTTP на HTTPS на одном хосте ), тогда вы можете сделать что-то вроде в верхней части вашего .htaccess файла:

RewriteEngine On

# Redirect HTTP to HTTPS (and www to non-www)
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule (.*) https://example.com/$1 [R=302,L]

Серверная переменная HTTPS - это альтернативный (и, возможно, более читабельный) способ проверки того, включен ли HTTPS или нет, вместо явной проверки SERVER_PORT.

Обратите внимание, что это 302 (временное) перенаправление. Измените его на 301 (постоянный) перенаправление, только если вы проверили, что он работает нормально.

Вам нужно очистить кеш браузера перед тестированием.


Проблемы с указанными вами директивами:

RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://example.com/$1 [R,L]

Это только перенаправляет HTTP на HTTPS. Он не канонизирует запрос на https://www.example.com/. Это также временное (302) перенаправление.

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

Помимо синтаксической неверности (у вас есть пробел между флагами RewriteRule - что приведет к 500 внутренним ошибкам сервера), это только перенаправляет www и HTTP. Но он перенаправляет на HTTP, а не HTTPS! Следовательно, он не будет канонизировать / перенаправлять http://example.com/ или https://www.example.com.

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

Опять же, директива RewriteRule синтаксически недействительна по причине, указанной выше. Это только перенаправляет www и HTTPS. Следовательно, он не будет канонизировать http://example.com/ или http://www.example.com.

...