Назад | Перейти на главную страницу

Используйте ProxyPassMatch для всех URL-адресов, кроме корневого пути

Я искал решение этой проблемы и надеялся, что это только я. Я пытаюсь перенаправить весь трафик с 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 

(плюс обычная конфигурация хоста для работы на новом порту и конфигурация виртуального хоста на этом порту). Это немного беспорядочно, но, похоже, это помогает!

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