Apache 转发而不重定向(应用程序不会遵循重定向)

Apache 转发而不重定向(应用程序不会遵循重定向)

最近我们必须将 /task 移至 /public/task,并且我想配置 Apache 以进行相应的重定向。

然而,使用 mod_rewrite,虽然它在浏览器中有效,但似乎会破坏对上述位置进行 api 调用的应用程序。发生的情况是应用程序返回一个页面,其中显示页面已移动的消息,但应用程序不会遵循重定向。

那么,有没有办法简单地将任何到 /task 的流量转发到 /public/task 而无需“重定向”,即返回重定向状态代码?


编辑:这里有更多信息。我找到了一个简单的测试来澄清我要修复的问题。这是需要转发的 URL 路径:

https://mydomain.com/task

需要去:

https://mydomain.com/public/task

如果我对原始域名使用 curl,它只会返回重定向页面通知。如果我添加 -L 标志,告诉 curl 遵循重定向,它就会成功遵循重定向。

我假设在调用 /task URL 路径的应用程序中(我无法访问)发生了非常类似的事情。由于我无法修改应用程序以使其正确遵循重定向,因此我正在寻找可以在 Apache 中实现的解决方案。


编辑 2:感谢大家的意见。ryanm 建议在重写中使用 [P] 标志,这个建议奏效了。以下是我所做的一切:

Apache 显然有三种方法可以将访问者转发或重定向到 URL:别名、代理和重写。

别名似乎是最明显的解决方案,因为它会默默地将访问者转发到新的指定位置。不幸的是,这对我来说不起作用,因为别名需要在实际文件系统上指定新位置,而对于 Jboss,该位置在每次重新部署/重新启动时都会发生变化。

使用 ProxyPass 似乎也可以,而且可能确实可以,但无论我如何配置它,curl 都会返回一个空结果,看起来什么都没有发生。这是我用来无效的 Proxy 命令:

ProxyPass /task http://localhost:8080/public/task

最后,重定向(使用 [P] 标志)解决了该问题。我最初的重定向如下所示:

RewriteRule ^/task/(.*)$ public/task/$1 [R,L]

使用 [R],Apache 会将重定向标头返回到客户端,这在任何浏览器中都可以正常工作,但会导致 curl 等应用程序停止指示它们重定向的页面。Curl 需要 -L 标志才能遵循重定向。

最后,使用 ProxyPass 和 Rewrite 的组合,我终于让它工作了。我按照 ryanm 的建议使用了 [P] 标志,现在 curl 可以遵循重定向,而无需使用 -L 标志。我的最终指令如下所示:

RewriteRule ^/task/(.*)$ http://localhost:8080/public/task/$1 [P]

再次感谢大家的帮助!

答案1

我已经成功使用了 mod_alias 而没有给客户端重定向;这是从浏览器请求的 URL /request/ 到内部目录 /opt/myapplication。

然而,如果该解决方案由于某种原因不起作用,你是否考虑过mod_rewrite 代理标志代理人设置?这是同一个服务器,但如果别名不起作用,代理可能会在本地主机上运行。

答案2

如果您不知道服务器上正在运行什么类型的应用程序,您可以使用Alias。 就像是:

Alias /task /var/www/.../public/task

答案3

我假设您在某种 *nix 服务器上。

我能想到两种可能有效的方法来解决这个问题。

1)符号链接这两个目录。ln -s /path/to/domain/public/task /path/to/domain/task严格来说,这不是 Apache 答案,但它可能比 Apache 解决方案执行得更快。您将需要Options FollowSymLinks用于域的配置。

2)Apache 别名这是 chultz 发布的答案,所以如果您选择这个,请选择他的作为解决方案。他先找到答案。您需要 mod_alias 才能找到这个。

相关内容