我正在尝试设置从 Apache 到 Flask 的反向代理。但是,Apache 收到 404 返回码。
我在 Apache 的 VirtualHost 块中配置了一个反向代理,如下所示(用 example.com 替换真实服务器名称)
<VirtualHost XXX.XXX.XXX>XXX:443>
...
ProxyPreserveHost On
ProxyPass /csm http://localhost:5000
ProxyPassReverse /csm http://localhost:5000
</VirtualHost>
我也把这个添加到我的 Flask
from werkzeug.middleware.proxy_fix import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_proto=1, x_host=1, x_prefix=1)
预期的场景是,如果用户键入“https://example.com/csm”,我的应用程序将使用 @login_required 装饰器返回 /authenticate/login?next=%2F 并显示登录页面。
当我键入 https://www.example.com/csm 时,它返回 404。在浏览器位置框中,它显示 https://www.example.com/authenticate/login?next=%2F 这正是我所期望的。但是,它返回页面未找到。我验证了 mod_proxy 和 mode_proxy_http 已加载。我可以看到 Apache 确实联系了 Gunicorn 并且我的应用程序确实返回了 URL。我错过了什么??
这是使用“curl -v https://www.example.com/csm”的 curl 详细调用
* h2h3 [:method: GET]
* h2h3 [:path: /csm]
* h2h3 [:scheme: https]
* h2h3 [:authority: www.example.com]
* h2h3 [user-agent: curl/7.84.0]
* h2h3 [accept: */*]
* Using Stream ID: 1 (easy handle 0x7fd562011a00)
> GET /csm HTTP/2
> Host: www.example.com
> user-agent: curl/7.84.0
> accept: */*
>
< HTTP/2 302
< strict-transport-security: max-age=31536000
< server: gunicorn
< date: Mon, 13 Mar 2023 05:01:28 GMT
< content-type: text/html; charset=utf-8
< content-length: 262
< location: http://www.example.com/authenticate/login?next=%2F
< vary: Cookie,Accept-Encoding
< set-cookie: session=eyJfZmxhc2hlcyI6W3siIHQiOlsibWVzc2FnZSIsIlBsZWFzZSBsb2cgaW4uIl19XX0.ZA6uKA.OpyUIrP6XwKxov_ITMIehyF7Qm0; HttpOnly; Path=/
<
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>Redirecting...</title>
<h1>Redirecting...</h1>
* Connection #0 to host www.example.com left intact
<p>You should be redirected automatically to target URL: <a href="/authenticate/login? next=%2F">/authenticate/login?next=%2F</a>. If not click the link.%