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

Is it possible to match more than one regular expression with a single <proxymatch> правило?</proxymatch>

У меня есть сервер производства, тестирования и разработки для сайта, который я поддерживаю. Все три сервера работают под управлением Apache 2.2.16 в Debian 6 GNU / Linux. Я установил новую версию сайта нашей компании на тестовом сервере, и моя команда определила, что она достаточно стабильна для перехода в производственную среду. Однако я хочу сделать этот переход максимально плавным. Я хотел бы иметь возможность перенаправлять запросы на производственный сервер, чтобы они обрабатывались тестовым сервером. Таким образом, я могу протестировать эту новую реализацию, не внося никаких сложных изменений конфигурации на производственном сервере.

В идеале я могу использовать Apache mod_proxy модуль для настройки обратного прокси-сервера, чтобы я мог обслуживать страницы непосредственно с тестового сервера для рабочих клиентов. Я прочитал документацию на http://httpd.apache.org/docs/2.0/mod/mod_proxy.html, который мне очень помог. Я включил mod_proxy и mod_proxy_http, то я установил на своем сервере разработки следующие правила.

<VirtualHost *:80>
    ServerName dev.example.com
    # ... other <VirtualHost>-specific settings ...

    ProxyRequests Off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyPass / http://test.example.com/
    ProxyPassReverse / http://test.example.com

    # ... various <Directory> directives ...
</VirtualHost>

Это сработало очень хорошо. Когда я обратился к серверу разработки, сайт обслуживал все страницы непосредственно с тестового сервера, и казалось, что эти ответы пришли непосредственно с сервера, к которому я подключился. Более того, эти запросы были довольно быстрыми, и я мог делать запросы GET и POST, как если бы я разговаривал напрямую с тестовым сервером.

К сожалению, это не соответствует всем моим потребностям. Поскольку тестовый сервер запускает Apache только с новой версией сайта, я не могу размещать веб-почту или каталоги пользователей с тестового сервера. Эти запросы должны обрабатываться производственным сервером.

Я хочу, чтобы мой рабочий сервер мог использовать обратный прокси для всех страниц. Кроме /webmail и пользовательские каталоги (любой каталог, начинающийся с тильды). Теоретически это возможно с <ProxyMatch> директива. Однако у меня нет достаточного количества регулярных выражений для этого. Существует ли единое правило, позволяющее исключить оба этих типа запросов из отправки на прокси-сервер?

Бонусные очки: Я ищу хорошее вводное руководство по PCRE, чтобы я мог написать свои собственные правила. Есть ли у кого-нибудь рекомендации для новичка в регулярных выражениях?

В директиве не может быть более одного регулярного выражения, но вы можете иметь регулярное выражение, реализующее сложную логику:

/http:\/\/test.example.com\/\/(?!webmail)/

Я бы порекомендовал книгу О'Рейли Освоение регулярных выражений но это не вводный текст.

В Интернете есть множество материалов, с которых можно начать. Есть базовый учебник здесь. Но я бы посоветовал обзавестись хорошей книгой по этой теме (но я не могу порекомендовать, исходя из личного опыта).