Правила перезаписи работают неправильно, если правило перезаписи для HTTP на HTTPS находится в том же файле .htaccess, а завершение SSL выполняется на балансировщике нагрузки

У меня есть два сервера Apache за балансировщиком нагрузки. Оба сервера идентичны и используются в качестве хостов для нескольких веб-сайтов клиентов. Они попросили меня включить доступ по https для всех сайтов, вместе с безусловным перенаправлением HTTP-запросов на https (поэтому, когда кто-то выбирает http-ссылку, возвращаемую поисковой системой, закладкой и т. д., она получает https-версию).

Поскольку существует несколько доменов, мне потребовался мультидоменный SSL-сертификат. Я знал, что могут быть проблемы с SNI в старых браузерах, поэтому решил установить сертификат на балансировщике нагрузки и позволить ему завершить работу. Учитывая, что завершение SSL выполняется на балансировщике нагрузки, весь трафик между балансировщиком нагрузки и серверами не зашифрован.

Итак, для трафика http и https на любой веб-сайт, например www.example.com, у меня есть только один виртуальный хост, потому что весь трафик идет через порт 80:

<VirtualHost *:80>
    DocumentRoot "/var/www/html/website001"
    ServerName www.example.com
</VirtualHost>

Содержимое веб-сайта www.example.com физически находится в папке / var / www / html / website001:

Folder1
Folder2
file1.html
file2.html
index.html
.htaccess
...

Содержимое /var/www/html/website001/.htaccess:

RewriteEngine on

#First block of rules
RequestHeader set X-Forwarded-Proto "http"
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

#Second block of rules
RewriteRule ^First-file$ /file1.html
RewriteRule ^Second-file$ /file2.html

Первый блок правил должен выполнять безусловное перенаправление с http на https для каждой страницы, а второй блок должен предоставлять удобные для пользователя URL-адреса для file1.html и file2.html. Следовательно, запрос на

http://www.example.com/First-file 

следует переписать на

https://www.example.com/First-file

и открыть файл file1.html в браузере. К сожалению, второй блок правил работает только частично: он открывает file1.html, но не перезаписывает URL-адрес, который отображается как

https://www.example.com/file1.html 

. Когда первый блок правил удаляется или закомментирован, второй блок правил работает правильно.

Кто-нибудь знает, как это можно решить?

0
задан 19 January 2018 в 00:18
1 ответ

Я фактически исправил проблему. Как косвенно предложил г-н Уайт, я удалил

RequestHeader set X-Forwarded-Proto "http"

из файла .htaccess. Однако, это не сработало, но, основываясь на большой короткой статье, которую я прочитал в интернете (https://bharatikunal.wordpress.com/2010/12/03/howto-forcing-traffic-to-https/), я поместил

RequestHeader set X-Forwarded-Proto "https"

в файл по умолчанию VirtualHost /etc/httpd/conf.d/ssl.conf, и все заработало, как и ожидалось.

.
0
ответ дан 5 December 2019 в 06:47

Теги

Похожие вопросы