У меня есть сервер Apache под прокси, который может работать по HTTPS. Вместо отправки заголовка HTTPS = on он отправляет HTTP_X_FORWARDED_PROTO = https.
Я хочу написать правило .htaccess, которое перенаправляет все запросы с https на http, если URL-адрес не / user / login.
То, что я придумал, связано с этими строками (что делает бесконечный цикл):
RewriteCond %{HTTP:http_x_forwarded_proto} !http
RewriteRule ^ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Проблема с вашим правилом перенаправления, вероятно, в том, что вы дублируете префикс «http_». В этом не должно быть необходимости. Если у вас есть обратный прокси-сервер перед вашим сервером (например, F5 или nginx), заголовок будет «X-Forwarded-Proto» или иногда «X-Forwarded_Proto». Чтобы ссылаться на них в правиле перезаписи, используйте% {HTTP: Name-Of-Header} (регистр не чувствителен).
Для наиболее надежной перезаписи, работающей во всех ситуациях, используйте что-то вроде этого:
# Make sure all SSL pages for dot-com are redirected to HTTP.
RewriteCond %{SERVER_PORT} 443 [OR]
RewriteCond %{HTTPS} on [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} https [OR]
RewriteCond %{HTTP:X-Forwarded_Proto} https
RewriteRule (.*) http://%{HTTP_HOST}/$1 [R=301,L]
Более подробная информация об использовании заголовков в RewriteCond приведена в Документация Apache mod_rewrite.
Я думаю, что проблема с вашим начальным состоянием в том, что у вас! Http вместо! = Http. Это может исправить бесконечный цикл.
RewriteEngine On
RewriteCond %{HTTP:http_x_forwarded_proto} !=http
RewriteCond %{REQUEST_URI} !^/user/login.*
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Это должно принять любой https-запрос, который не является / user / login, и переписать его на http. Я уверен, что есть более элегантный способ сделать это. Вы можете избавиться от RewriteCond% {HTTP: http_x_forwarded_proto}! = Http, и он, вероятно, будет работать точно так же, например, поскольку он должен принимать любой переданный ему запрос, который не включает / user / login, и перенаправлять его на http.