我想将针对确切特定位置的请求重定向到代理服务器,但两种解决方案都不起作用:
<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
了它,但是匹配的正则表达式被传递给代理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
Apache 解决以下问题的常用方法:
是使用带有 ProxyPass 和 ProxyPassReverse 的普通 Location 块,以及 ProxyErrorOverride 和 ErrorDocument。未经测试的例子:
看: