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

Почему из-за этого мой сайт перенаправляется на secure.secure. * Корневой домен * .com?

Я воссоздаю мой вопрос из 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]

Различия:

  1. В общем, лучше проверить, включен ли HTTPS, проверив %{HTTPS} вместо проверки номера порта - вы можете легко привязать HTTPS для этого сайта к другому порту, и это нарушит правило (и вам придется его отредактировать). Но это зависит от ваших конкретных обстоятельств ... так что решать вам.

  2. Лучше сделайте «301 постоянный редирект» (R=301), а не "302 Найдено" (R) - особенно, если с этими URL-адресами работает SEO. Но еще раз - это вообще не большое дело.

  3. У тебя есть .\ в вашем шаблоне для сопоставления хостов - я предполагаю, что это просто опечатка.


Если вы не хотите, чтобы ваше доменное имя было жестко запрограммировано, вы можете попробовать это правило, но я не могу гарантировать вам, что оно будет работать на 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, но его немного легче читать (на мой взгляд).