使用 Apache mod_proxy 默认使用子文件夹

使用 Apache mod_proxy 默认使用子文件夹

我有这个 vhost 配置,但是“重定向”部分似乎不起作用。是错误的吗?

<VirtualHost *:80>
    ServerAlias in.example.com
    ProxyRequests Off
    ProxyVia Off
    ProxyPass / http://127.0.0.1:9091/
    ProxyPassReverse / http://127.0.0.1:9091/
    Redirect permanent / http://in.example.com/web/
</VirtualHost>

答案1

您无法通过 ProxyPass / 和重定向 /。我猜您想要做的是将所有请求通过 ProxyPass 发送到您的本地应用程序,如果返回 404 Not Found,则将它们重定向到其他地方。

不幸的是,如果您在 127.0.0.1:9091 上的应用程序返回 404,那么它将返回给您的客户端。

相反,您需要“取消代理”您的应用将提供的路径。您可以通过两种方式执行此操作:

  1. 仅为已知路径创建 ProxyPass 规则:

例如:

ProxyPass /myapp http://localhost:9091

2. 创建排除:

例如:

ProxyPass / http://localhost:9091
ProxyPass /notmyapp !
ProxyPass /images !

这将使/notmyapp/images传递到重定向

答案2

由于它提供重定向,因此可能mod_alias无法加载。但是,您会在日志中看到配置错误。

您的 ProxyPass 和 ProxyPassReverse 指令也可能优先。如果您打算重定向,则应将规则放在代理服务器上,或删除代理指令。代理将通过 301 重定向。

此外,如果你将 / 重定向到其自身的子目录,则会创建一个重定向循环。从文档:任何以 URL-path 开头的请求都会将重定向请求返回到目标 URL 位置的客户端。匹配的 URL-path 之外的其他路径信息将附加到目标 URL。这意味着当浏览器跟进对 /web/ 的请求时,它将重定向到http://in.example.com/web/web/等等。考虑改用带有锚定正则表达式的 RedirectMatch。如果您说不起作用是指浏览器抱怨重定向循环,那么这就是答案。

相关内容