问题描述

如果我想通过本地 (别名:当前服务器) 代理服务器路由一个 HTTP 请求,我该如何解决?

wp-config.php 的允许的代理设置如下:

# HTTP Proxies
# Used for e.g. in Intranets
# Fixes Feeds as well
# Defines the proxy adresse.
define( 'WP_PROXY_HOST',          '127.0.84.1' );
# Defines the proxy port.
define( 'WP_PROXY_PORT',          '8080' );
# Defines the proxy username.
define( 'WP_PROXY_USERNAME',      'my_user_name' );
# Defines the proxy password.
define( 'WP_PROXY_PASSWORD',      'my_password' );
# Allows you to define some adresses which 
# shouldn't be passed through a proxy.
define( 'WP_PROXY_BYPASS_HOSTS',  'localhost, www.example.com' );

这个问题是 a follow up on this question

最佳解决方案

代理设置的工作方式与常规的 HTTP 请求一样,但在这种情况下,这种方式很明显地通过一个代理进行路由。在 WordPress 方面,API 的传输层都支持代理连接 (fsockopen,fopen,cURL,) 。

关于代理配置的事情有几种,每种设置都是不同的,所以它使得这个难度很大,如果您的代理在本地主机或远程机器上,这并不重要,wp-config.php 设置将无论如何都可以工作。通常,如果您在具有特定要求的 Intranet /防火墙上使用这些设置。

值得注意的是,您可以将 localhost /webserver 设置为默认使用 HTTP 请求的代理/链接,在这种情况下,不需要使用 wp-config.php 设置任何选项,因为在服务器级配置。如果禁用代理,您通常会看到 error 130 ERR_PROXY_CONNECTION_FAILED 的响应代码,但这些设置不在 WordPress 的范围内。

一些可以帮助您设置和调试代理连接的工具:

要挖掘 WordPress HTTP API,我建议使用 http_api_debug 动作 (改为 var_dump 通过 viper007bond 网站找到) 的以下代码片段:

add_action( 'http_api_debug', 'viper_http_api_debug', 10, 5 );

function viper_http_api_debug( $response, $type, $class, $args, $url ) {
    // You can change this from error_log() to var_dump() but it can break AJAX requests
    var_dump( 'Request URL: ' . var_export( $url, true ) );
    var_dump( 'Request Args: ' . var_export( $args, true ) );
    var_dump( 'Request Response : ' . var_export( $response, true ) );
}

请求响应是有趣的部分,有时您可以快速查看您的请求是否通过代理。

例如使用默认 HTTP API 作出以下请求。

$api_url = 'http://api.wordpress.org/secret-key/1.0/';
$response = wp_remote_get($api_url);
$header = wp_remote_retrieve_headers( $response );

var_dump($header);

现在同样的确切请求,但使用通过 wp-config.php 启用远程代理

//I grabbed these off of Google search they will not work for long.
define( 'WP_PROXY_HOST', '210.22.115.162' );
define( 'WP_PROXY_PORT', '3128' );

你可以看到代理的输出是不同的,最重要的是代理是添加 via 标签,在这种情况下是一个 squid 代理。代理应该这样做,而不是改变服务器 response-header,但不是每个人都遵循规则,所以要小心;) 。

常数 define( 'WP_PROXY_BYPASS_HOSTS', 'localhost, www.example.com' )对于允许访问您可能不希望通过代理 (例如 WordPress 更新) 的主机很有用。 class-http.php 中的评论是误导的,因为默认情况下,localhostget_option('siteurl); 已经包含在内,但可以通过 pre_http_send_through_proxy 过滤器进行更改。

一些可用于代理设置的附加选项包括:WP_HTTP_BLOCK_EXTERNAL WP_ACCESSIBLE_HOSTS

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。