Как я могу использовать части заголовка ссылки в правиле перезаписи Apache

#apache #mod-rewrite #proxy

#apache #mod-перезапись #прокси

Вопрос:

Я пишу своего рода общий прокси-сервер, чтобы я мог получить доступ к одному хосту, в форме http://<proxy-host>/<host-to-proxy-to>/<port>/<path>/ которого в настоящее время используются перезаписи для прокси-запросов к https://<host-to-proxy-to>:<port>/<path>

У меня эта часть работает, и, похоже, она делает то, что я хочу. Однако в некоторых сценариях я использую его с упрямыми сайтами, которые принудительно используют корневые относительные URL-адреса. Приложение, о котором идет речь, не особенно легко (а в некоторых случаях невозможно) изменить.

Моя проблема заключается в том, как определить корневые относительные URL-адреса, которые попадают в apache, и перенаправить их на правильный хост. Я определил, что правильные сведения о хосте все еще находятся в пути заголовка ссылки, поэтому я пытаюсь разделить и использовать путь ссылки в правиле перезаписи.

Обновленный код ниже:

 <VirtualHost *:80>
  ServerName wtf.devbox-cole.orion.internal
  ServerAlias wtf.devbox-cole

  RewriteEngine On

  <LocationMatch "^/$">
    Header always set X-CRAP-BASE "Its working kinda"
    Redirect 410 /
  </LocationMatch>

  <Location /web/>
    Header always set X-CRAP-BASE "Hardly Working"
    RewriteCond %{HTTP_REFERER} "http://%{HTTP_HOST}/([a-zA-Z0-9_.]*)/([0-9]*)/.*"
    RewriteRule (.*) https://%1:%2/$1 [P]
  </Location>

  <LocationMatch "^/(?<host>[a-zA-Z0-9_.]*)/(?<port>[0-9]*)/(?<path>.*)">
    RewriteRule ".*" https://%{env:MATCH_HOST}:%{env:MATCH_PORT}/%{env:MATCH_PATH} [P]
    ProxyPassReverse "https://%{env:MATCH_HOST}:%{env:MATCH_PORT}/%{env:MATCH_PATH}"
  </LocationMatch>

  # Enable proxying to https://
  SSLProxyEngine On
  # Allow Proxying to https without valid cert
  SSLProxyVerify none
  # Disable Domain Nmae checking on the Certs
  SSLProxyCheckPeerCN off
  SSLProxyCheckPeerName off
  # disbaled cert expiryt Check
  SSLProxyCheckPeerExpire off

  LogLevel debug rewrite:trace8
  CustomLog "/var/log/apache2/wtf_log" "%h"
  ErrorLog "/var/log/apache2/wtf_error
</VirtualHost>
  

Приведенный выше код все еще не совсем работает. Все еще пытаюсь выяснить, почему..

Комментарии:

1. Вау, отличный проект! Не могли бы вы поделиться URL-адресом вашего прокси-сервера? 🙂

2. Кроме того: какой сюрприз, что в документации модуля перезаписи упоминается referrer и фактически приводятся примеры. Было бы интересно посмотреть, что вы узнаете из этого. Но, конечно, вы уже прочитали это и решили спросить здесь вместо этого … httpd.apache.org/docs/current/mod/mod_rewrite.html

3. Вот мое определение VHost до сих пор: [суть] ( gist.github.com/arcticShadow/43b8a914ff12d066ef0b7ba706725343 ) — блок веб-локатора — это место, где я пытаюсь извлечь сегменты заголовка referrer и передать их на перезапись. Я ничего не видел в этих строках в документах.

4. Пожалуйста, добавьте всю соответствующую информацию к самому вопросу выше. Не размещайте дополнительную информацию в комментариях или произвольных местах вне сайта. Спасибо.

5. Извините, я до сих пор не считал свою работу релевантной. Проводил публикацию, потому что вы попросили ссылку. Я добавлю к вопросу.

Ответ №1:

Итак, после многих попыток и прочтения как можно большего количества документации, которую я могу найти, мне удалось решить мой первоначальный вопрос. Следующий блок VHost будет прокси http://domain.com/<host>/<port>/<path> https://<host>:<port>/<path> , И он будет сопоставлять любые запросы /web/* , исходящие из этого домена, обратно в нужное место.

 <VirtualHost *:80>
  ServerName domain.com

  RewriteEngine On

  <LocationMatch "^/$">
    Header always set X-CRAP-BASE "Its working kinda"
    Redirect 410 /
  </LocationMatch>

  <Location /web/>
    Header always set X-CRAP-BASE "Hardly Working"
  </Location>

  RewriteCond %{REQUEST_URI} "^/web/.*"
  RewriteCond %{HTTP_REFERER} "http://.*/([a-zA-Z0-9_.-]*)/([0-9]*)/.*"
  RewriteRule (.*) https://%1:%2/$1 [P]

  RewriteCond %{REQUEST_URI} "^/([a-zA-Z0-9_.-]*)/([0-9]*)/(.*)"
  RewriteRule ".*" https://%1:%2/%3 [P]

  <LocationMatch "^/(?<host>[a-zA-Z0-9_.-]*)/(?<port>[0-9]*)/(?<path>.*)">
    ProxyPassReverse "https://%{env:MATCH_HOST}:%{env:MATCH_PORT}/%{env:MATCH_PATH}"
  </LocationMatch>

  # Enable proxying to https://
  SSLProxyEngine On
  # Allow Proxying to https without valid cert
  SSLProxyVerify none
  # Disable CN Checking on the Certs
  SSLProxyCheckPeerCN off
  SSLProxyCheckPeerName off
  # Disable Cert Expiry Check
  SSLProxyCheckPeerExpire off

  # Extra Logging
  #LogLevel debug rewrite:trace8
  CustomLog "/var/log/apache2/domain.com_log" "%h"
  ErrorLog "/var/log/apache2/domain.com_error
</VirtualHost>
  

И затем я вспомнил, насколько глупы заголовки реферера, поскольку, если файл CSS запрашивает другой файл CSS или, например, изображение, то реферер устанавливается не так, как ожидалось: facepalm: