Я пытаюсь использовать 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]
Будет проблема, пишите на почту.