最近我们必须将 /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 才能找到这个。