Как перенаправить трафик на http

Как перенаправить трафик на http

У меня есть сервер 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]

решение1

Проблема с вашим правилом перенаправления, вероятно, в том, что вы дублируете префикс "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.

решение2

Я думаю, проблема с вашим начальным условием в том, что у вас !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.

Связанный контент