在apache httpd中完成URL重写时,POST请求转换为GET

时间:2014-11-04 05:20:45

标签: apache mod-rewrite url-rewriting

我有一个apache Web服务器,充当内部应用服务器的反向代理。我已经使用ProxyPass和ProxyPassReverse来实现这一目标。我有多个上下文根映射到不同的应用程序。

我正在尝试从一个上下文的域名中删除上下文根,以便用户可以直接以https://mydomain.com而不是https://mydomain.com/contextRoot访问该网站。我添加了以下重写规则,而不是此上下文的proxypass和proxypassreverse配置。

# redirecting old URL to new URL
RewriteRule ^/contextRoot(.*)$ https://mydomain.com$1 [L,R=301]

# proxying to internal app servers
RewriteCond %{REQUEST_URI} !^(/anotherContextRoot1.*)$
RewriteCond %{REQUEST_URI} !^(/anotherContextRoot2.*)$
RewriteRule .* http://10.1.0.1:8080/contextRoot%{REQUEST_URI} [L,P]

此配置适用于所有http GET请求。对于POST请求,重定向发生,但后续调用变为GET。

请帮助我理解为什么会发生这种情况,我该如何纠正这一点。我还想了解是否有更多的重写规则配置,我已经添加了以执行前一个配置中的proxypassreverse。

2 个答案:

答案 0 :(得分:2)

这个问题在这里得到解答https://softwareengineering.stackexchange.com/questions/99894/why-doesnt-http-have-post-redirect/99966#99966 - 这个答案的简短摘要

  

在HTTP 1.1中,实际上有一个状态代码(307),表示应该使用相同的方法重复请求并发布数据。

     

正如其他人所说,这里有可能被滥用,这可能是许多框架在抽象中坚持301和302的原因。

答案 1 :(得分:0)

我有同样的问题,并检查了一点。这个问题在另一篇文章中得到了回答:

redirectmatch changes post to get