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

apache2 mod_proxy в сочетании с mod_rewrite не работает должным образом

Я пытаюсь использовать mod_rewrite вместе с mod_proxy для доставки содержимого с другого внутреннего веб-сервера (http://webserver.internal.com/foo) через (поддельный) подкаталог "foo" (http://example.com/foo).

Используя mod_proxy с директивой ProxyPass, я уже смог сделать это с этой конфигурацией в /etc/apache2/mods-enabled/proxy.conf

ProxyPass /foo http://webserver.internal.com/foo
ProxyPassReverse /foo http://webserver.internal.com/foo

Теперь у меня есть дополнительное требование, чтобы принудительно перезаписывать все запросы к динамическим ресурсам из http://example.com на https: // example.com, который тоже работает автономно, но не вместе с правилами ProxyPass, указанными выше. Кажется, что конфигурация прокси-сервера всегда имеет приоритет над правилами перезаписи.

Насколько мои исследования показали, что использование mod_proxy из моих правил перезаписи должно быть таким же простым, как добавление

RewriteCond% {REQUEST_URI} ^ / foo RewriteRule ^ / foo (. *) http://webserver.internal.com/foo1 доллар США [P]

в мои правила перезаписи, и перезаписанный URI будет автоматически передан через mod_proxy. Я включил RewriteLog с LogLevel, равным 9, но я не могу увидеть соответствие ^ / foo и выполнение следующего Proxy-RewriteRule впоследствии. Нет ничего лучше прокси-сервера или упоминания о проксировании, нет даже записи об ошибке в RewriteLog.

В моей конфигурации apache2 активированы следующие прокси-модули

proxy 
proxy_connect 
proxy_http

Я попытался проверить свое RewriteCondition на другом примере - на этот раз сопоставив ^ / foo и перенаправив на www.google.com

RewriteCond %{REQUEST_URI} ^/foo
RewriteRule ^(.*)$ http://www.google.com/ [R=302,L]

который работает по назначению, со следующими результатами в RewriteLog:

RewriteCond: input = '/ foo' pattern = '^ / foo' => соответствует rewrite 'foo' -> 'http://www.google.com/'явное принудительное перенаправление с http://www.google.com/ побег http://www.google.com/ для перенаправления перенаправления на http://www.google.com/ [REDIRECT / 302]

Ниже приведена конфигурация перезаписи, которую я использую в разделе каталога моего виртуального хоста.

    <Directory /my/app/webroot >
            RewriteEngine On
            RewriteBase /

            #redirect all http requests to https - WORKING
            # incoming request was forwarded as http from ELB
            RewriteCond %{HTTP:X-Forwarded-Proto} =http
            # avoid https rewriting for static files like images, javascripts, files and templates
            # for folders /img, /js, /css, /files and /templates under webroot
            RewriteCond %{REQUEST_URI} !^/(img|js|css|files|templates)
            RewriteRule (.*) https:// example.com%{REQUEST_URI}  [R=301,L]

            # requests to /foo *should* be handled by mod_proxy - NOT WORKING
            RewriteCond %{REQUEST_URI} ^/foo
            RewriteRule ^/foo(.*) http://webserver.internal.com/foo$1 [P]

            #pretty URLS for web-application - WORKING
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
    </Directory>

Рассматриваемая машина представляет собой базовую установку сервера debian с apache2 и php и размещается в облаке Amazon за Elastic Load Balancer.

Если вы дочитали до этого места - прежде всего - спасибо за терпение!

Было бы здорово, если бы кто-нибудь помог решить эту проблему. Может быть, это просто небольшая мысль, которую я наблюдал.

Спасибо заранее!

Неправильно:

RewriteRule ^/foo(.*) http://webserver.internal.com/foo$1 [P]

Правильно:

RewriteRule ^foo(.*)$ http://webserver.internal.com/foo$1 [P,L]

Будет проблема, пишите на почту.