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