我想将对确切特定位置的请求重定向到代理服务器,但这两种解决方案都不起作用:
<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>
看: