问题描述
如果我想通过本地 (别名:当前服务器) 代理服务器路由一个 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 的范围内。
一些可以帮助您设置和调试代理连接的工具:
-
Fiddler(仅限 Windows) 。 http://www.fiddler2.com/fiddler2/
-
Charles http://www.charlesproxy.com/
要挖掘 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
中的评论是误导的,因为默认情况下,localhost
和 get_option('siteurl);
已经包含在内,但可以通过 pre_http_send_through_proxy
过滤器进行更改。
一些可用于代理设置的附加选项包括:WP_HTTP_BLOCK_EXTERNAL
WP_ACCESSIBLE_HOSTS
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。