为什么WP HTTP API在重定向时将方法(POST/PURGE)切换为GET(302)?

时间:2018-07-11 作者:jerclarke

经过痛苦的调试后,我发现请求WP HTTP API(但在本例中wp_remote_request()) 总是以GET 方法,即使该方法是初始请求中的其他方法(在我的情况下PURGE 由使用Varnish HTTP Purge plugin)

通常这适用于POST 请求,其中重定向到GET 请求相同的URL意味着完全删除使用POST. 在我的情况下,使用PURGE 结果是Apache加载了我试图清除的实际URL,这不是我想要的。

关键是:你绝不会希望这种情况发生。无论您使用何种方法发送请求,您最终肯定希望使用该方法。这种行为令人困惑和恼火,对于大多数用户来说可能是莫名其妙的错误(在我的情况下,这个错误花了我多年的时间才找到,并且一直在减慢我没有安装Varnish的本地开发站点的速度)。

我把这个问题贴出来,这样我就可以自己回答,希望人们将来能用谷歌找到它。关键是aware 这样,如果这种行为发生在你身上,你就可以找到一种方法来解决它。

2 个回复
最合适的回答,由SO网友:jerclarke 整理而成

事实证明class-request->parse_response(), 在为各种更高级别的请求函数处理重定向的地方(这是它为每个后续跃点执行递归请求的地方),有一个奇怪的钩子最终会运行WP_Http->browser_redirect_compatibility() 在重定向请求上。

browser_redirect_compatibility() 非常简单:

public static function browser_redirect_compatibility( $location, $headers, $data, &$options, $original ) {
        // Browser compat
        if ( $original->status_code === 302 ) {
            $options[\'type\'] = Requests::GET;
        }
    }
基本上,只要有302重定向,它就会删除您选择的方法,并将其替换为GET. 他们似乎认为他们正在转换POST 请求,但从阅读中可以清楚地看到,这将适用于除GET 结果是302。

但值得注意的是DOESN\'T 对301重定向有任何影响,并且似乎与302的错误相关。您可以在[上一个问题中]阅读更多关于302及其问题的信息,该问题与POST 请求转换为获取和丢失数据](Temporary redirect prevents getting $_POST array)

影响Apache但不影响Nginx

这似乎很相关:我的本地开发环境使用MAMP,站点通过Apache托管,这就引发了一个疯狂的问题。

我们的live站点使用Nginx->Varnish->Nginx设置,无论出于何种原因,都不会使用相同的重定向302 但实际上301 因此工作正常(他们保持PURGE 在重定向的位置https URL的版本,而不是http 版本)。

因此,我建议所有有此问题的人:

  • 完全切换到Nginx,因为它似乎不使用302进行此类重定向。Apache suxhttps 开始是一个明显的改进,将使我们的日志更干净)

SO网友:Danila Vershinin

将方法更改为GET 从重定向后POST, PURGE, BAN 不管怎样,这是完全合法的,并且已经存在,而且将没有Wordpress(这与它无关,真的)。欢迎来到World Wide Web:

注意:由于历史原因,用户代理可能会将后续请求的请求方法从POST更改为GET。如果不希望出现这种行为,可以使用307(临时重定向)状态代码。

通常,不要期望在重定向后保留方法,除非您能够修改客户端软件来这样做。

结束

相关推荐

在数据库中,主页使用的是Https,但在后台使用的是http,并且无法编辑

我通过使用“更好的搜索和替换”将我的web从http切换到https,乍一看一切都很好。所有资源都是通过https传输的,Firefox显示了一个绿色锁。但当我现在上传一个新图像时,我看到它将通过http传输。我立即检查了数据库,但在选项/主页和选项/网站URL中the entry is https. 在wp config中,我还使用define(\'FORCE\\u SSL\\u ADMIN\',true);。现在奇怪的是:在“设置/常规”下检查WordPress地址(URL)时,有一个无法编辑的htt