サブディレクトリとしてインストールするとバグる?
-
例として
example.comを使ってます。www.example.com/Blog/このロケーションをNginxで設定して
バックエンドで/Blogをlocalhost:8081にプロキシしています。www.example.com/Blog/は正常に表示されます。www.example.com/Blog/wp-admin/でログインしてリダイレクトされるとwww.example.com/wp-adminにリダイレクトされます。
なぜでしょうか?
Nginxの設定は/Blogをlocalhost:8081に/Blogを消してそのままあとは伝えるだけにしてます。
この動作のため管理画面で相対リンクで書かれているurlが404になりますwww.example.com/wp-adminも同じように404になります。
-
リバースプロキシ先の nginx がサブディレクトリインストールされていることを認識できないからだと思われます。
まず、リバースプロキシ先の nginx 設定に以下を追加してください。rewrite ^/Blog(/.*)$ $1 break;
上記の設定だけでうまく行かなければwp-config.phpに以下を追加して WordPress 管理画面のURLがサブディレクトリ以下になるようにしてください。define( 'WP_SITEURL', 'https://www.example.com/Blog' );設定は一応しているんです
それでも事象が発生しますこれで大丈夫かわかりませんがテスト用のlocalhostで事象を再現したのを載せます
wp-confif.php
<?php
/**
* The base configuration for WordPress
*
* The wp-config.php creation script uses this file during the installation.
* You don't have to use the website, you can copy this file to "wp-config.php"
* and fill in the values.
*
* This file contains the following configurations:
*
* * Database settings
* * Secret keys
* * Database table prefix
* * ABSPATH
*
* This has been slightly modified (to read environment variables) for use in Docker.
*
* @link https://developer.wordpress.org/advanced-administration/wordpress/wp-config/
*
* @package WordPress
*/
// IMPORTANT: this file needs to stay in-sync with https://github.com/WordPress/WordPress/blob/master/wp-config-sample.php
// (it gets parsed by the upstream wizard in https://github.com/WordPress/WordPress/blob/f27cb65e1ef25d11b535695a660e7282b98eb742/wp-admin/setup-config.php#L356-L392)
// a helper function to lookup "env_FILE", "env", then fallback
if (!function_exists('getenv_docker')) {
// https://github.com/docker-library/wordpress/issues/588 (WP-CLI will load this file 2x)
function getenv_docker($env, $default) {
if ($fileEnv = getenv($env . '_FILE')) {
return rtrim(file_get_contents($fileEnv), "\r\n");
}
else if (($val = getenv($env)) !== false) {
return $val;
}
else {
return $default;
}
}
}
// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', getenv_docker('WORDPRESS_DB_NAME', 'wordpress') );
/** Database username */
define( 'DB_USER', getenv_docker('WORDPRESS_DB_USER', 'example username') );
/** Database password */
define( 'DB_PASSWORD', getenv_docker('WORDPRESS_DB_PASSWORD', 'example password') );
/**
* Docker image fallback values above are sourced from the official WordPress installation wizard:
* https://github.com/WordPress/WordPress/blob/1356f6537220ffdc32b9dad2a6cdbe2d010b7a88/wp-admin/setup-config.php#L224-L238
* (However, using "example username" and "example password" in your database is strongly discouraged. Please use strong, random credentials!)
*/
/** Database hostname */
define( 'DB_HOST', getenv_docker('WORDPRESS_DB_HOST', 'mysql') );
/** Database charset to use in creating database tables. */
define( 'DB_CHARSET', getenv_docker('WORDPRESS_DB_CHARSET', 'utf8mb4') );
/** The database collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', getenv_docker('WORDPRESS_DB_COLLATE', '') );
/**#@+
* Authentication unique keys and salts.
*
* Change these to different unique phrases! You can generate these using
* the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}.
*
* You can change these at any point in time to invalidate all existing cookies.
* This will force all users to have to log in again.
*
* @since 2.6.0
*/
define( 'AUTH_KEY', getenv_docker('WORDPRESS_AUTH_KEY', 'xxxxxxxxxx') );
define( 'SECURE_AUTH_KEY', getenv_docker('WORDPRESS_SECURE_AUTH_KEY', 'xxxxxxxxxx') );
define( 'LOGGED_IN_KEY', getenv_docker('WORDPRESS_LOGGED_IN_KEY', 'xxxxxxxxxx') );
define( 'NONCE_KEY', getenv_docker('WORDPRESS_NONCE_KEY', 'xxxxxxxxxx') );
define( 'AUTH_SALT', getenv_docker('WORDPRESS_AUTH_SALT', 'xxxxxxxxxx') );
define( 'SECURE_AUTH_SALT', getenv_docker('WORDPRESS_SECURE_AUTH_SALT', 'xxxxxxxxxx') );
define( 'LOGGED_IN_SALT', getenv_docker('WORDPRESS_LOGGED_IN_SALT', 'xxxxxxxxxx') );
define( 'NONCE_SALT', getenv_docker('WORDPRESS_NONCE_SALT', 'xxxxxxxxxx') );
// (See also https://wordpress.stackexchange.com/a/152905/199287)
/**#@-*/
/**
* WordPress database table prefix.
*
* You can have multiple installations in one database if you give each
* a unique prefix. Only numbers, letters, and underscores please!
*
* At the installation time, database tables are created with the specified prefix.
* Changing this value after WordPress is installed will make your site think
* it has not been installed.
*
* @link https://developer.wordpress.org/advanced-administration/wordpress/wp-config/#table-prefix
*/
$table_prefix = getenv_docker('WORDPRESS_TABLE_PREFIX', 'wp_');
/**
* For developers: WordPress debugging mode.
*
* Change this to true to enable the display of notices during development.
* It is strongly recommended that plugin and theme developers use WP_DEBUG
* in their development environments.
*
* For information on other constants that can be used for debugging,
* visit the documentation.
*
* @link https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/
*/
define( 'WP_DEBUG', !!getenv_docker('WORDPRESS_DEBUG', '') );
/* Add any custom values between this line and the "stop editing" line. */
// If we're behind a proxy server and using HTTPS, we need to alert WordPress of that fact
// see also https://wordpress.org/support/article/administration-over-ssl/#using-a-reverse-proxy
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {
$_SERVER['HTTPS'] = 'on';
}
// (we include this by default because reverse proxying is extremely common in container environments)
if ($configExtra = getenv_docker('WORDPRESS_CONFIG_EXTRA', '')) {
eval($configExtra);
}
define('WP_HOME', 'http://localhost/Blog');
define('WP_SITEURL', 'http://localhost/Blog');
/* That's all, stop editing! Happy publishing. */
/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
define( 'ABSPATH', __DIR__ . '/' );
}
/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';nginx.conf
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /Blog/ {
rewrite ^/Blog(/.*)$ $1 break;
proxy_pass http://wordpress:80/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}docker-compose.yml
version: '3.8'
services:
wordpress:
image: wordpress:latest
ports:
- "8081:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress_password
WORDPRESS_DB_NAME: wordpress_db
volumes:
- wordpress_data:/var/www/html
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: wordpress_db
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress_password
volumes:
- db_data:/var/lib/mysql
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- wordpress
volumes:
wordpress_data:
db_data:-
この返信は3ヶ月、 1週前に
瀬戸内ことり (Setouchi Kotori)が編集しました。
rewrite ^/Blog(/.*)$ $1 break;はリバースプロキシ元の nginx 設定ではなく、リバースプロキシ先の nginx 設定に記載してください。
私の環境では、この設定で問題なく動作しています。# リバースプロキシ元
upstream backend {
server unix:/var/run/nginx-backend.sock;
}
server {
listen 80;
server_name _;
root /var/www/html;
index index.php index.html index.htm;
proxy_redirect off;
proxy_cache czone;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Remote-Addr $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $proxy_proto;
proxy_set_header X-Forwarded-Port $proxy_port;
proxy_set_header Accept-Encoding "";
proxy_set_header Proxy "";
location /Blog {
proxy_cache_key "$proxy_proto://$host$request_uri";
proxy_cache_valid 200 0m;
proxy_pass http://backend;
}
location ~ /\.ht {
deny all;
}
}# リバースプロキシ先
server {
listen unix:/var/run/nginx-backend.sock;
server_name _;
root /var/www/html;
index index.php index.html index.htm;
access_log /var/log/nginx/backend.access.log;
keepalive_timeout 25;
port_in_redirect off;
gzip off;
gzip_vary off;
rewrite ^/Blog(/.*)$ $1 break;
# This order might seem weird - this is attempted to match last if rules below fail.
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
# Pass all .php files onto a php-fpm/php-fcgi server.
location ~ \.php$ {
expires off;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass phpfpm;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_intercept_errors on;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_busy_buffers_size 32k;
fastcgi_temp_file_write_size 256k;
fastcgi_param REMOTE_ADDR $http_x_real_ip;
}
}-
この返信は3ヶ月、 1週前に
wokamotoが編集しました。
すみません初心者で申し訳ないのですがwordpressは基本はApacheではないのですか?
なのでリバースプロキシ先のNginxとは何でしょうか
自分が思っていたのはwordpressにサイトurlを正しく設定しNginxでプロキシすれば大丈夫だと思っていたのですがちょっと整理のためにお聞きしますが、
www.example.comを表示しているWebサーバーは、Apacheなのですか?Nginxなのですか?そしてそれは、ポート8081を表示しているWebサーバーとは違うのですか。あと、「wordpressは基本はApacheではないのですか?」とありますが、PHPさえ扱えるWebサーバーであれば、別にApache限定というわけではないですよ。NiginxでもLiteSpeedでもIISでも、好きなの使ってください。
何とかネットで調べて解決することに成功しました。
必要ないとは思いますが私が使用したdocker-compose.ymlなどを書いておきます
あとwordpressを実行しているのはApacheでリバースプロキシににNginxを使ってますdocker-compose.yml
version: '3.8'
services:
blog:
image: wordpress:latest
restart: always
volumes:
- blog_data:/var/www/html/blog"
working_dir: /var/www/html/blog # <- これがポイント
links:
- mysql:mysql-host
environment:
WORDPRESS_DB_HOST: mysql-host:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
mysql:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql"
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- blog
volumes:
blog_data:
db_data:nginx.conf
events {
worker_connections 1024;
}
http {
upstream blog_backend {
server blog:80;
}
server {
listen 80;
server_name localhost;
location /blog {
proxy_pass http://blog_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}解決したようで何よりです。
最終的にはご自身で解決されたとしても、あなたのために時間を割いてくださった @wokamoto さんや @mokkosan さんへの感謝の意をお示しいただくとよいのではないかなと、その1点が気になりました。
ここで質問やヘルプを求めたとき、答えることで直接の報酬をもらえる人はいません。回答してくれる人に対しての礼儀を忘れないようにしてください。
フォーラム詳細ルール──
-
この返信は3ヶ月、 1週前に
このトピックに返信するにはログインが必要です。