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

Apache: LocationMatch или ProxyMatch не работает с RegEx

Я хочу перенаправить запросы на конкретное местоположение на прокси-сервер, но оба решения не работают:

<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:

  • отправка всех суб-путей от корня к восходящему
  • скрытие исходящих ошибок 4xx и 5xx со статическими страницами

- использовать простой блок 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>

Видеть: