Я хочу перенаправить запросы на конкретное местоположение на прокси-сервер, но оба решения не работают:
<VirtualHost *:80>
ServerName exmaple.com
<LocationMatch "^/test01$">
ProxyPreserveHost On
ProxyPass http://localhost:8000/
ProxyPassReverse http://localhost:8000/
</LocationMatch>
<ProxyMatch "^/test02$">
ProxyPreserveHost On
ProxyPass http://localhost:8000/
ProxyPassReverse http://localhost:8000/
</ProxyMatch>
</VirtualHost>
Тест:
$ curl -I exmaple.com/test01
HTTP/1.1 404 Not Found
Date: Sun, 17 Jun 2018 15:37:10 GMT
Server: Apache
Content-Type: text/html; charset=iso-8859-1
$ curl -I exmaple.com/test02
HTTP/1.1 404 Not Found
Date: Sun, 17 Jun 2018 15:37:13 GMT
Server: Apache
Content-Type: text/html; charset=iso-8859-1
Когда я удаляю часть RegEx, она работает, но я хочу, чтобы Apache отображал 404, а не сервер разработки Django:
<LocationMatch "/test01">
ProxyPreserveHost On
ProxyPass http://localhost:8000/
ProxyPassReverse http://localhost:8000/
</LocationMatch>
$ curl -I exmaple.com/test01
HTTP/1.1 200 OK
Date: Sun, 17 Jun 2018 15:42:26 GMT
Server: WSGIServer/0.2 CPython/3.6.5
Content-Type: text/html; charset=utf-8
X-Frame-Options: SAMEORIGIN
Content-Length: 12767
$ curl -I exmaple.com/test01/none
HTTP/1.1 404 Not Found
Date: Sun, 17 Jun 2018 15:42:33 GMT
Server: WSGIServer/0.2 CPython/3.6.5
Content-Type: text/html; charset=UTF-8
X-Frame-Options: SAMEORIGIN
Content-Length: 2073
Обновление: понедельник, 18 июня, 14:40:59 UTC 2018
Итак, я провел дополнительное исследование и, согласно Apache, документы:
При использовании внутри
<Location>
раздел, первый аргумент опускается, и локальный каталог получается из<Location>
. То же самое произойдет внутри<LocationMatch>
раздел; однако ProxyPass не интерпретирует регулярное выражение как таковое, поэтому в этой ситуации необходимо использовать ProxyPassMatch.
Так что я попробовал ProxyPassMatch
и он работает, однако соответствующий RegEx передается в Proxy http://localhost:8000/test01
и я не этого хочу.
Я легко могу добиться этого с помощью Nginx:
server {
listen 80;
server_name exmaple.com;
location = /test01/ {
proxy_pass http://localhost:8000/;
proxy_set_header Host $host;
}
}
Как я могу сделать что-то подобное с Apache?
Обновление: вс, 24 июня, 10:46:12 UTC 2018
<LocationMatch "^/test01$">
Redirect / http://test.com/
</LocationMatch>
$ curl -I exmaple.com/test01
HTTP/1.1 302 Found
Date: Sun, 24 Jun 2018 10:47:04 GMT
Server: Apache
Location: http://test.com/test01
Content-Type: text/html; charset=iso-8859-1
Обычный способ решения проблемы с Apache:
- использовать простой блок Location с ProxyPass и ProxyPassReverse, а также с ProxyErrorOverride и ErrorDocument. Непроверенный пример:
<VirtualHost *:80>
ServerName exmaple.com
ProxyErrorOverride On
ProxyPreserveHost On
ErrorDocument 404 "That resource was not found"
<Location /test01>
ProxyPass http://localhost:8000/
ProxyPassReverse http://localhost:8000/
</Location>
</VirtualHost>
Видеть: