問題描述

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