Я использую IBM HTTP Server (к сожалению, на основе Apache версии 2.2) для размещения нескольких доменов. Для этих доменов тысячи рукописных RewriteRules накопились за эти годы. Эти правила находятся внутри специфичных для сайта файлов конфигурации, которые включены в оба раздела VirtualHost для каждого сайта, один раз для порта 80 и один раз для порта 443.
Веб-серверы не подключены напрямую к Интернету. Вместо этого перед ними находится балансировщик нагрузки, который также завершает SSL-соединения. Это означает, что у меня «SSLEngine off» в VirtualHosts для порта 443. Запросы, отправленные через HTTPS через порт 443, все еще поступают на веб-серверы через порт 443, просто не зашифрованные.
Большинство правил RewriteRules имеют следующую форму:
RewriteRule ^/some-path/$ /some-other-path [L,R=301]
Что я теперь выяснил, так это то, что эти перенаправления всегда прерываются, когда / somepath вызывается через HTTPS. Пример:
wget --max-redirect=0 -S --spider https://example.com/some-path
...
Location: http://example.com:443/some-other-path
Как видите, пользователь перенаправлен на HTTP через порт 443, что неудивительно, что не работает с большинством клиентов. Google Chrome явно пытается сделать что-то правильное, но curl, wget, Firefox и Internet Explorer не работают (и это правильно).
Я знаю, как определить правильный протокол и переписать все RewriteRules для правильной работы. Проблема в том, что я хочу избежать этого, если это вообще возможно. Я говорю о более чем 8000 правил различных форм в более или менее «свободном» формате. Хотя я достаточно опытен в использовании Vim, я ожидаю появления множества ошибок, которые приведут к дополнительной работе.
Есть ли способ заставить протокол для RewriteRules без указания протокола в самих правилах?
Единственный способ, который я нашел, это удалить опцию L во всех правилах и просто иметь «последнее» правило для всех сайтов, которое исправляет протокол. Но я не уверен, приведет ли это к непредвиденным последствиям, поскольку я твердо полагаю, что некоторые цели перенаправления будут соответствовать более поздним RewriteRules.
Есть идеи?