У меня проблемы с изменением всех запросов на 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]
Однако это конкретное перенаправление предполагает, что у вас нет других поддоменов.