Я воссоздаю мой вопрос из Stack Overflow потому что это более подходящее место, чтобы задать этот вопрос. Исходный вопрос ниже.
Вот правило перезаписи, которое я использую:
RewriteCond %{SERVER_PORT} ^443$
RewriteCond %{HTTP_HOST} !^(www.)secure.\ [NC]
RewriteRule (.*) https://secure.%{HTTP_HOST}%{REQUEST_URI} [R,L]
Это правило должно применяться, если это порт 443 (порт SSL) и если запрошенный домен не начинается с secure или www.secure.
Вместо этого он перенаправляется на secure.secure, а затем возвращает ошибку 404. В качестве альтернативы, если я удалю безопасное от перезаписи правила создания
RewriteCond %{SERVER_PORT} ^443$
RewriteCond %{HTTP_HOST} !^(www.)secure.\ [NC]
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
Я получаю слишком много ошибок переадресации.
Признаюсь, я не эксперт по mod_rewrite, но считаю себя способным функционировать, ссылаясь на документацию. Однако это меня озадачивает. Спасибо!
Лучше всего жестко кодировать доменное имя (я не знаю, какие доменные имена у вас могут быть, поэтому это предпочтительный вариант). Попробуйте это правило:
RewriteCond %{HTTPS} =on
RewriteCond %{HTTP_HOST} !^(www\.)?secure\. [NC]
RewriteRule .* https://secure.example.com%{REQUEST_URI} [R=301,L]
Различия:
В общем, лучше проверить, включен ли HTTPS, проверив %{HTTPS}
вместо проверки номера порта - вы можете легко привязать HTTPS для этого сайта к другому порту, и это нарушит правило (и вам придется его отредактировать). Но это зависит от ваших конкретных обстоятельств ... так что решать вам.
Лучше сделайте «301 постоянный редирект» (R=301
), а не "302 Найдено" (R
) - особенно, если с этими URL-адресами работает SEO. Но еще раз - это вообще не большое дело.
У тебя есть .\
в вашем шаблоне для сопоставления хостов - я предполагаю, что это просто опечатка.
Если вы не хотите, чтобы ваше доменное имя было жестко запрограммировано, вы можете попробовать это правило, но я не могу гарантировать вам, что оно будет работать на 100% правильно:
RewriteCond %{HTTPS} =on
RewriteCond %{HTTP_HOST} !^(www\.)?secure\.(.+)$ [NC]
RewriteRule .* https://secure.%2%{REQUEST_URI} [R=301,L]
Я избегал жесткого кодирования доменного имени, используя %{HOST_NAME}
в моем RewriteRule
линия, как рекомендовано Том О'Коннор в ответ на мой вопрос Принудительное использование SSL в Apache без жесткого кодирования имени хоста, если это поможет, но основная часть вашей проблемы (мне) заключается в том, что %1
соответствует (www.)?
от твоего RewriteCond
, а не (.*)
от твоего RewriteRule
, что было бы %2
, как было предложено LazyOne в их ответе.
Лично я бы использовал следующее:
RewriteCond %{HTTPS} =on
RewriteCond %{HTTP_HOST} !^(www.)?secure\.(.+)$ [NC]
RewriteRule ^(.*)$ https://secure.$2/$3 [R=301,L]
, который лишь немного отличается от предложения LazyOne, но его немного легче читать (на мой взгляд).