Объединение перезаписи прокси-сервера на http-сервере apache с манипуляцией заголовком

#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>