Repository navigation
Document HTTP proxy configuration for WP-CLI and WordPress core #658
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,192 @@ | ||||||
| # HTTP Proxy Configuration | ||||||
|
|
||||||
| When running WP-CLI in restricted network environments or behind corporate firewalls, you may need to route outbound HTTP/HTTPS requests through an HTTP proxy. | ||||||
|
|
||||||
| WP-CLI and WordPress core use the Requests HTTP library for performing remote HTTP requests. By default, WP-CLI does not automatically read or trust proxy environment variables (such as `HTTP_PROXY` or `HTTPS_PROXY`). | ||||||
|
|
||||||
| To configure an HTTP proxy for WP-CLI, you can use the community package [`ekamran/wp-cli-http-proxy-command`](https://github.com/ekamran/wp-cli-http-proxy-command) (recommended for full WP-CLI and WordPress proxy support), or manually configure WordPress core proxy constants in a bootstrap file. | ||||||
|
|
||||||
| ## Using the HTTP Proxy Package (Recommended) | ||||||
|
|
||||||
| The [`ekamran/wp-cli-http-proxy-command`](https://github.com/ekamran/wp-cli-http-proxy-command) community package provides complete proxy support for both WP-CLI's internal HTTP requests (e.g. package management, updates) and WordPress core HTTP requests. | ||||||
|
|
||||||
| > Note: The package requires WP-CLI 2.12.0 or newer. | ||||||
|
|
||||||
| ### Installation | ||||||
|
|
||||||
| Install the package using the `wp package install` command: | ||||||
|
|
||||||
| ```bash | ||||||
| wp package install ekamran/wp-cli-http-proxy-command | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. On WP-CLI 2.12.0 the bare name installs
Suggested change
|
||||||
| ``` | ||||||
|
|
||||||
| ### Configuration | ||||||
|
|
||||||
| Add an `http-proxy` configuration block to your project's `wp-cli.yml` or your global `~/.wp-cli/config.yml` file: | ||||||
|
|
||||||
| ```yaml | ||||||
| http-proxy: | ||||||
| url: http://proxy.example.com:8080 | ||||||
| ``` | ||||||
|
|
||||||
| Scheme-less proxy URLs are also supported: | ||||||
|
|
||||||
| ```yaml | ||||||
| http-proxy: | ||||||
| url: proxy.example.com:8080 | ||||||
| ``` | ||||||
|
|
||||||
| Or configure the host and port separately: | ||||||
|
|
||||||
| ```yaml | ||||||
| http-proxy: | ||||||
| host: proxy.example.com | ||||||
| port: 8080 | ||||||
| ``` | ||||||
|
|
||||||
| ### Authentication and Bypass Hosts | ||||||
|
|
||||||
| If your proxy requires authentication or if specific hosts should bypass the proxy, specify them in the configuration: | ||||||
|
|
||||||
| ```yaml | ||||||
| http-proxy: | ||||||
| url: http://proxy.example.com:8080 | ||||||
| username: proxy-user | ||||||
| password: proxy-password | ||||||
| bypass-hosts: | ||||||
| - localhost | ||||||
| - 127.0.0.1 | ||||||
| - "*.local" | ||||||
| - "*.example.com" | ||||||
| ``` | ||||||
|
coderabbitai[bot] marked this conversation as resolved.
Resolved
|
||||||
|
|
||||||
| > Warning: Do not commit proxy credentials to source control. Use an untracked configuration file (for example `wp-cli.local.yml`), restrict file permissions, or inject credentials through your deployment environment. | ||||||
|
|
||||||
| ### Using Environment Variables | ||||||
|
|
||||||
| By default, proxy environment variables are not read automatically. To opt into reading proxy settings from your environment variables, set `env: true`: | ||||||
|
|
||||||
| ```yaml | ||||||
| http-proxy: | ||||||
| env: true | ||||||
| ``` | ||||||
|
|
||||||
| When `env: true` is set, the package selects the **first non-empty** environment variable from this list and applies **one global proxy** for all requests: | ||||||
|
|
||||||
| 1. `HTTPS_PROXY` | ||||||
| 2. `https_proxy` | ||||||
| 3. `HTTP_PROXY` | ||||||
| 4. `http_proxy` | ||||||
|
coderabbitai[bot] marked this conversation as resolved.
Resolved
|
||||||
|
|
||||||
| This differs from libcurl, which can use separate proxies per scheme (for example `http_proxy` for HTTP and `https_proxy` for HTTPS) and honors `NO_PROXY` / `no_proxy` for bypass rules. This package does **not** read `NO_PROXY` or `no_proxy`. If you rely on bypass rules from your environment, map those entries to `bypass-hosts` in your configuration instead. | ||||||
|
|
||||||
| ### Diagnostic Commands | ||||||
|
|
||||||
| The package includes diagnostic commands to help verify your proxy configuration. | ||||||
|
|
||||||
| Check the current proxy configuration status: | ||||||
|
|
||||||
| ```bash | ||||||
| wp http-proxy status | ||||||
| ``` | ||||||
|
|
||||||
| Perform a test HTTP request through WP-CLI's HTTP helper to verify connectivity: | ||||||
|
|
||||||
| ```bash | ||||||
| wp http-proxy check https://wordpress.org | ||||||
| ``` | ||||||
|
|
||||||
| ### Behavior and Disabling | ||||||
|
|
||||||
| When active, the package: | ||||||
|
|
||||||
| - Automatically defines missing WordPress proxy constants (`WP_PROXY_HOST`, `WP_PROXY_PORT`, `WP_PROXY_USERNAME`, `WP_PROXY_PASSWORD`, `WP_PROXY_BYPASS_HOSTS`) after `wp-config.php` loads. | ||||||
| - Configures WP-CLI's internal HTTP requests by filtering `http_request_options`. | ||||||
| - Normalizes proxy URLs to Requests' `host:port` format. | ||||||
| - Applies `bypass-hosts` to both WordPress and WP-CLI HTTP requests. | ||||||
|
|
||||||
| To temporarily disable the proxy without removing the package, set `enabled: false` in your YAML configuration: | ||||||
|
|
||||||
| ```yaml | ||||||
| http-proxy: | ||||||
| enabled: false | ||||||
| ``` | ||||||
|
|
||||||
| You can also bypass all installed packages for a single command invocation by passing the `--skip-packages` global flag: | ||||||
|
|
||||||
| ```bash | ||||||
| wp --skip-packages core update | ||||||
| ``` | ||||||
|
|
||||||
| ### Limitations | ||||||
|
|
||||||
| Composer-backed `wp package` commands, including `browse`, `list`, `install`, and `update`, use a separate HTTP client. Their network requests are not configured by this package. | ||||||
|
|
||||||
| ## Manual Configuration (WordPress Core Only) | ||||||
|
|
||||||
| If you cannot install community packages or only need to configure proxy support for WordPress core HTTP requests, you can define the core proxy constants in a custom PHP file loaded via `wp-cli.yml`. | ||||||
|
|
||||||
| 1. Create a `proxy.php` file (e.g. in your project or home directory): | ||||||
|
|
||||||
| ```php | ||||||
| <?php | ||||||
| $proxy_host = getenv( 'HTTPS_PROXY' ) ?: getenv( 'https_proxy' ) ?: getenv( 'HTTP_PROXY' ) ?: getenv( 'http_proxy' ); | ||||||
|
|
||||||
| if ( ! $proxy_host ) { | ||||||
| return; | ||||||
| } | ||||||
|
|
||||||
| $proxy_url = parse_url( $proxy_host ); | ||||||
|
|
||||||
| if ( ! is_array( $proxy_url ) || empty( $proxy_url['host'] ) ) { | ||||||
| return; | ||||||
| } | ||||||
|
|
||||||
| $proxy_port = ! empty( $proxy_url['port'] ) ? (int) $proxy_url['port'] : null; | ||||||
|
|
||||||
| if ( null === $proxy_port ) { | ||||||
| $scheme = ! empty( $proxy_url['scheme'] ) ? $proxy_url['scheme'] : 'http'; | ||||||
| $proxy_port = ( 'https' === $scheme ) ? 443 : 80; | ||||||
| } | ||||||
|
coderabbitai[bot] marked this conversation as resolved.
Resolved
|
||||||
|
|
||||||
| define( 'WP_PROXY_HOST', $proxy_url['host'] ); | ||||||
| define( 'WP_PROXY_PORT', $proxy_port ); | ||||||
|
|
||||||
| if ( ! empty( $proxy_url['user'] ) ) { | ||||||
| define( 'WP_PROXY_USERNAME', rawurldecode( $proxy_url['user'] ) ); | ||||||
| } | ||||||
|
|
||||||
| if ( ! empty( $proxy_url['pass'] ) ) { | ||||||
| define( 'WP_PROXY_PASSWORD', rawurldecode( $proxy_url['pass'] ) ); | ||||||
| } | ||||||
|
|
||||||
| if ( ! defined( 'WP_PROXY_BYPASS_HOSTS' ) ) { | ||||||
| define( 'WP_PROXY_BYPASS_HOSTS', 'localhost, 127.0.0.1' ); | ||||||
| } | ||||||
| ``` | ||||||
|
|
||||||
| 2. Require this file in your `wp-cli.yml` or `~/.wp-cli/config.yml`: | ||||||
|
|
||||||
| ```yaml | ||||||
| require: | ||||||
| - proxy.php | ||||||
| ``` | ||||||
|
coderabbitai[bot] marked this conversation as resolved.
Resolved
|
||||||
|
|
||||||
| Alternatively, when creating a new WordPress install, you can embed proxy constants in `wp-config.php` using `wp config create --extra-php`: | ||||||
|
|
||||||
| ```bash | ||||||
| wp config create --dbname=example --dbuser=root --dbpass=secret --extra-php <<'PHP' | ||||||
| define( 'WP_PROXY_HOST', 'proxy.example.com' ); | ||||||
| define( 'WP_PROXY_PORT', 8080 ); | ||||||
| PHP | ||||||
| ``` | ||||||
|
|
||||||
| This `extra-php` approach only applies to the generated `wp-config.php` at install time. It does not configure WP-CLI's own HTTP requests and is not suitable for existing installs unless you add the constants manually. | ||||||
|
|
||||||
| > Note: This manual approach sets the constants used by WordPress core HTTP requests after WordPress loads, but does not automatically route WP-CLI's pre-bootstrap or standalone HTTP requests (such as `wp package` commands). For complete proxy coverage across all WP-CLI operations, use the [`ekamran/wp-cli-http-proxy-command`](https://github.com/ekamran/wp-cli-http-proxy-command) package. | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The package does not cover
Suggested change
|
||||||
|
|
||||||
| ## Related Documentation | ||||||
|
|
||||||
| * [Global parameters and configuration files](https://make.wordpress.org/cli/handbook/references/config/) — how `wp-cli.yml` and the `require` option work. | ||||||
| * [Installing WP-CLI Packages](https://make.wordpress.org/cli/handbook/guides/installing-packages/) — package installation and version constraints. | ||||||
| * [Troubleshooting Guide](https://make.wordpress.org/cli/handbook/guides/troubleshooting/) — debugging network and configuration issues. | ||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
wp packagecommands go through Composer, so the package does not cover them. The Limitations section below says the same. Suggest naming what it does cover: