Я искал решение этой проблемы и надеялся, что это только я. Я пытаюсь перенаправить весь трафик с URL-адреса, который мы размещаем, на другой сервер, управляемый другим поставщиком, у которого мы покупаем, чтобы мы могли настроить корневой URL-адрес.
Я использую httpd 2.2.3 (Apache). Это настраивается в разделе VirtualHost, это также SSL (однако я не думаю, что это должно иметь значение).
Все отлично работает, кроме исключения.
Что у меня (упрощенно):
ProxyPreserveHost On
<VirtualHost 1.2.3.4:443> SSLProxyEngine On
ProxyPassMatch ^/$ !
ProxyPassMatch ^/(.*)$ https://proxy.example.com/$1
ProxyPassReverse / https://proxy.example.com/
SSLEngine on
...
</VirtualHost>
Однако это всегда переходит на удаленный сайт. Я пробовал несколько комбинаций, таких как:
ProxyPassMatch /$ ! ProxyPassMatch ^/(.*)$ https://proxy.example.com/$1
ProxyPassMatch com/ ! ProxyPassMatch ^/(.*)$ https://proxy.example.com/$1
Я также попытался пойти другим путем (чтобы сопоставить что-либо с чем-то после /, то есть:
ProxyPassMatch ^/(..+)$ https://proxy.example.com/$1 ProxyPassMatch / !
ProxyPassMatch ^/(..*)$ https://proxy.example.com/$1 ProxyPassMatch / !
Теперь в документации говорится, что он соответствует URL-адресу, но я не нашел доказательств того, что это то, что он на самом деле делает (например, второй вариант выше с com /).
Я также пробовал кучу других комбинаций, которые либо подходят ко всему, либо ничего не соответствуют.
Я думаю, что я не понимаю URL, который передается регулярному выражению, но не знаю, как на него смотреть. Я повысил уровень отладки в Apache, чтобы отлаживать, да и ничего полезного это не дает.
Ура.
Если бы мне пришлось угадывать, я бы сказал, что ваша проблема связана с совпадением «^ /. * $», Которое будет соответствовать «/». Если вы отбросили явное совпадение с / и заменили проход прокси на «^ /. + $», Это может решить вашу проблему. Но никаких обещаний.
Разница в том, что * эквивалентно. {0,}, а + эквивалентно. {1,}, поэтому. * Будет соответствовать любому или нет символов, тогда как вам нужно совпадение хотя бы с одним.
то есть: строка должна читать:
ProxyPassMatch ^/(.+)$ proxy.example.com/$1
Я нашел ответ или несколько способов обойти: использовать другой сервер (в данном случае локальный сервер все еще находится на том же экземпляре httpd).
то есть: строки выше теперь читаются:
ProxyPassMatch ^/$ 127.0.0.1:81
ProxyPassMatch ^/(.*)$ proxy.example.com/$1
(плюс обычная конфигурация хоста для работы на новом порту и конфигурация виртуального хоста на этом порту). Это немного беспорядочно, но, похоже, это помогает!
Я все еще хочу знать, сделал ли я что-то не так, и на этот вопрос есть «правильный» ответ - поскольку я считаю это чем-то вроде взлома.