問題描述
如果我想透過本地 (別名:當前伺服器) 代理伺服器路由一個 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。

