I'm having trouble changing all requests to https, while using the following for pretty URLs:
RewriteEngine On
RewriteBase /
RewriteRule ^/?([-_a-zA-Z0-9]+)$ /?p=$1
RewriteRule ^/?([-_a-zA-Z0-9]+)/([-_a-zA-Z0-9]+)$ /?par=$1&p=$2 [L]
I've tried adding the following directly beneath the above (and removing the L directive above) but get redirect errors:
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
What am I doing wrong here?
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]
Однако это конкретное перенаправление предполагает, что у вас нет других поддоменов.