#apache #http-headers #mod-proxy
#apache #http-заголовки #мод-прокси
Вопрос:
Я должен изменить заголовки ответов, доставляемые с помощью директивы перезаписи прокси-сервера, которую я настроил на http-сервере apache.
С этим простым примером все работает нормально, он безоговорочно доставляет цель с внутреннего сервера для всех запросов:
<VirtualHost ...>
...
# unconditionally modify headers
Header set Content-Type "text/html"
Header unset Content-Disposition
Header unset Content-Transfer-Encoding
# fetch goal from backend
RewriteEngine on
SSLProxyEngine on
RewriteRule ^ https://back.example.org/goal [P]
...
# prevent all access to the file system
DocumentRoot /var/www/html
<Directory /var/www/html>
Options none
Order deny,allow
Deny from All
</Directory>
</VirtualHost>
Однако проблема в том, что хост также должен доставлять несколько статических файлов с другого внутреннего сервера, где заголовки не должны быть изменены! Итак, я предпринял попытку перезаписать виртуальную цель на первом шаге, применить правила изменения заголовка, а затем на втором шаге к прокси:
<VirtualHost ...>
...
# modify headers only for /goal
<Location /goal>
Header set Content-Type "text/html"
Header unset Content-Disposition
Header unset Content-Transfer-Encoding
</Location>
# fetch static exceptions from static backend
RewriteEngine on
SSLProxyEngine on
RewriteRule static-1$ https://static.example.org/static-1 [P]
RewriteRule static-2$ https://static.example.org/static-2 [P]
RewriteRule static-3$ https://static.example.org/static-3 [P]
# two step rewrite and proxy to fetch goal from backend and get the headers modified
RewriteRule ^/goal$ https://back.xample.org/goal [P]
RewriteRule ^ /goal [PT,N]
...
# prevent all access to the file system
DocumentRoot /var/www/html
<Directory /var/www/html>
Options none
Order deny,allow
Deny from All
</Directory>
</VirtualHost>
Однако это оставляет меня со статусом http 403.
Я использовал перезапись журнала для дальнейшего понимания, и действительно, запрос переписывается на /goal
в соответствии с первым шагом, API URI-to-filehandler вызывается снова, а затем запрос просто отображается в файловой системе, что объясняет 403. Почему не применяется второй этап перезаписи, этап прокси-сервера, в следующем раунде?
Или, мой актуальный вопрос: как я могу применить изменения заголовка к результату общих правил перезаписи прокси, но определить некоторые явные исключения из изменений заголовка?
Ответ №1:
Хорошо, немного потыкал мир, так как я не получил ни ответа, ни комментария… (почему большинство моих вопросов наталкиваются только на стену молчания?).
Рабочим решением является использование отрицательной LocationMatch
директивы для исключений статического содержимого. Не сексуально, но работает:
<VirtualHost ...>
...
RewriteEngine on
SSLProxyEngine on
# fetch static exceptions from static backend
RewriteRule static-1$ https://static.example.org/static-1 [P]
RewriteRule static-2$ https://static.example.org/static-2 [P]
RewriteRule static-3$ https://static.example.org/static-3 [P]
# proxy goal from backend
RewriteRule ^ https://back.xample.org/goal [P]
...
# modify headers, but _not_ for static exceptions
<LocationMatch "^/(?!static)">
Header set Content-Type "text/html"
Header unset Content-Disposition
Header unset Content-Transfer-Encoding
</LocationMatch>
...
# prevent all access to the file system
DocumentRoot /var/www/html
<Directory /var/www/html>
Options none
Order deny,allow
Deny from All
</Directory>
</VirtualHost>