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

Перенаправляйте запросы ресурсов на https вместе с mod_rewrite для красивых URL-адресов

У меня проблемы с изменением всех запросов на https, при этом для красивых URL-адресов используются следующие:

RewriteEngine On
RewriteBase /
RewriteRule ^/?([-_a-zA-Z0-9]+)$ /?p=$1
RewriteRule ^/?([-_a-zA-Z0-9]+)/([-_a-zA-Z0-9]+)$ /?par=$1&p=$2 [L]

Я попытался добавить следующее непосредственно под приведенным выше (и удалить указанную выше директиву L), но получаю ошибки перенаправления:

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Что я здесь делаю не так?

RewriteCond %{HTTP:X-Forwarded-Proto} !https

В X-Forwarded-Proto заголовок устанавливается только прокси-сервером (или вредоносным клиентом), поэтому, если вы не используете какой-либо прокси-сервер SSL, вам не следует его использовать (если вы это сделаете, это, скорее всего, приведет к циклу перенаправления).

Должно появиться любое каноническое перенаправление (HTTP на HTTPS и / или без www на www) перед ваши внутренние переписывают.

Вместо этого попробуйте что-нибудь вроде следующего:

RewriteEngine On
RewriteBase /

RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L]

RewriteRule ^/?([-\w]+)$ /?p=$1 [L]
RewriteRule ^/?([-\w]+)/([-\w]+)$ /?par=$1&p=$2 [L]

Я добавил L флаг к вашей первой внутренней перезаписи.

В \w это просто сокращенный класс символов для [_a-zA-Z0-9].

(Если это в .htaccess затем /? префикс на RewriteRule шаблон не требуется.)

Изменить 302 (временное) перенаправление на 301 (постоянный), только если вы уверены, что он работает нормально, чтобы избежать проблем с кешированием во время тестирования. Перед тестированием вам необходимо убедиться, что кеш браузера очищен.

В идеале вы также должны канонизировать здесь www / non-www, а не полагаться на канонический метатег. Это может быть объединено с указанным выше перенаправлением HTTP на HTTPS. Например, для перенаправления на www:

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=302,L]

RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L]

Однако это конкретное перенаправление предполагает, что у вас нет других поддоменов.