Я в значительной степени новичок в настройке http, поэтому, пожалуйста, терпите меня (я унаследовал поддержку этой системы).
Мой веб-сервер работает за F5, который обрабатывает все квитирования https. Если входящий запрос предназначен для http, F5 передает запрос веб-серверу через порт 80. Если входящий запрос предназначен для https, F5 обрабатывает все квитирования, а затем передает запрос веб-серверу через порт 81.
Мой файл httpd.conf настроен для прослушивания портов 80 и 81. Для порта 81 определен один виртуальный хост:
<VirtualHost 172.10.112.10:81>
ServerName example.com
DocumentRoot /usr/local/mwi/www/winxp/81
RewriteEngine on
RewriteCond %{REQUEST_METHOD} !^(GET|POST|HEAD)$
RewriteRule .* - [F]
</VirtualHost>
Директивы «RewriteEngine on», «DocumentRoot / usr / local / mwi / www / winxs / 80» и все RewriteCond и RewriteRule находятся за пределами блока виртуального хоста (и не находятся в каком-либо другом блоке), что, как я понимаю, означает, что это глобальные директивы.
Моя проблема в том, что правила перезаписи обрабатываются правильно, когда http://example.com/whatever используется, но перезапись не выполняется, если запрос https://example.com/whatever. Веб-сайт возвращает ошибку 404 (страница не найдена). Вчера я нашел кое-что (на сайте apache), в котором говорилось, что глобальные директивы игнорируются, если есть блок виртуального хоста, соответствующий входящему запросу.
Я поискал и обнаружил, что могу сделать это с помощью файла htaccess, но это не рекомендуется из-за снижения производительности (у меня есть доступ к основному файлу httpd.conf).
Нужно ли мне создать дополнительный блок виртуального хоста для порта 80 и переместить в него все директивы Rewrite?
Нужно ли мне также копировать все директивы Rewrite на виртуальный хост для порта 81?
Я бы предпочел сохранить только один набор директив Rewrite для обоих портов. Как мне лучше всего этого добиться?
Заранее спасибо.
Харлей
JayMcTee - спасибо. Я использовал ваш ответ и понял свою проблему. Мне пришлось создать виртуальный хост для запросов порта 80 и удалить глобальные директивы перезаписи.
Судя по тому, как я понимал документ apache, я думал, что глобальные директивы перезаписи будут использоваться всегда, независимо от того, на какой порт поступает запрос. При более глубоком чтении документа было сказано, что если запрос обрабатывается виртуальным хостом, то будут использоваться только директивы перезаписи, указанные в этом виртуальном хосте. Первоначально я пытался просто скопировать директивы перезаписи в виртуальном хосте порта 81, но проблема все еще оставалась. Затем я создал виртуальный хост для порта 80 и использовал директиву Include на обоих виртуальных хостах.
Задача решена!
Если вы не хотите дублировать конфигурацию перезаписи, вы можете включить ее из внешнего файла:
Включить файлы в Apache HTTP Server версии 2.2 httpd.conf
Два отдельных блока, каждый из которых включает одну перезапись, вероятно, действительно были бы лучше всего.