Apache:LocationMatch 或 ProxyMatch 不适用于 RegEx

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

更新时间:2018 年 6 月 18 日星期一 14:40:59 UTC

因此我做了进一步的研究,根据 Apache文档

在部分内使用时<Location>,第一个参数被省略,并从中获取本地目录<Location>。在部分内也会发生同样的情况<LocationMatch>;但是,ProxyPass 不会这样解释正则表达式,因此在这种情况下需要使用 ProxyPassMatch。

因此我尝试了一下ProxyPassMatch并且它起作用了,但是匹配的 RegEx 被传递给了代理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 做类似的事情?

更新时间:2018 年 6 月 24 日(星期日)10:46:12 UTC

<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

答案1

用Apache解决以下问题的通常方法:

  • 将根下的所有子路径发送到上游
  • 使用静态页面隐藏上游发出的 4xx 和 5xx 错误

是使用带有 ProxyPass 和 ProxyPassReverse 的普通 Location 块,以及 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>

看:

相关内容