У меня есть устаревший сайт для благотворительности, работающий на старом экземпляре Apache 1.3, за Apache 2 с запущенным proxypass. Когда запрос приходит на example.com, Apache 2 отправляет его внутренне на localhost: 8080, который отлично работает.
Эта проблема:
example.com/blog/ работает, но example.com/blog (без косой черты в конце) нет. URL-адрес, на который он изменяется в Chrome, - example.com:8080/blog/ которого не существует.
То же верно и для всех остальных каталогов.
Apache 2:
<VirtualHost *:80>
ServerName example.com
ProxyPreserveHost On
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
</VirtualHost>
Апач 1:
NameVirtualHost *:8080
<VirtualHost *:8080>
DocumentRoot /usr/www/html/
ServerName example.com
RewriteEngine on
RewriteCond %{REQUEST_METHOD} !^(GET|POST|HEAD)$
RewriteRule .* - [F]
</VirtualHost>
Я думал, что простым решением будет добавить rewriterule в любой из виртуальных хостов, но я не добился успеха, несмотря на многие попытки. Я думаю, что ключевой проблемой является неправильный поиск example.com:8080 без косой черты. Было бы здорово, если бы кто-нибудь мог мне помочь, задавал мне дополнительную информацию, которая была бы полезна.
Я не вижу ProxyPassReverse
или mod_proxy_html
директивы в вашем конфиге; отсутствие ProxyPassReverse
, в частности, скорее всего, будет причиной вашей проблемы, поскольку серверная часть Apache отправляет перенаправление на URL-адрес с косой чертой, но имеет внутреннее имя в заголовке Location: и без ProxyPassReverse
внешний интерфейс Apache просто допускает утечку внутреннего URL-адреса.
mod_proxy_html
предназначен для эквивалентных проблем, но в HTML, а не в заголовках HTTP. Также стоит использовать, если вы не действительно конечно, никто не будет помещать полный URL-адрес в HTML (что для любого динамического веб-приложения - плохая ставка).