Traefik Wordpress 重定向

Traefik Wordpress 重定向

我有一个运行 Traefik 2.0 的 Docker Swarm 设置。我们目前在多台服务器上运行着许多 wordpress 网站,我们想将它们 docker 化。我们有一个在 Docker 上运行良好的 Traefik 实例,它为这些物理服务器提供文件提供程序,并路由到 Docker Wordpress 实例。这部分似乎运行良好。

我们已经配置好了要去的地方https://myblog.example.com这是 docker 中的一个 wordpress 实例,一切运行正常。然而老板希望它转到https://example.com/myblog。我以为这会很简单但它变得越来越有挑战性。

我使用 Traefik 中的 Host && PathPrefix 规则对其进行了配置,并且它可以按预期工作,但是当它到达 Wordpress 时,它会重定向到 wp-admin/install.php 进行安装大约 20 多次,直到由于重定向次数过多而出错。

我读到的所有内容都表明是 SSL 直通导致了这些问题。我尝试过使用 SSLProxyHeaders(您会在下面的配置中看到它的残余部分),我发现 Traefik 2.0 文档与旧版本相比相当缺乏。我预料到这种情况,因为它最近才发布。

经过几天的折腾,我决定删除 http->https 重定向,只转到我的网站 http 进行测试。它也收到太多重定向。对我来说,这不是 SSL 问题,而是 Wordpress 和/或 traefik 配置问题。我倾向于使用 traefik 配置,因为它可以很好地转到 http(s)://myblog.example.com

docker-compose.yml:

version: '3'

services:
   db:
     image: mysql:5.7
     volumes:
       - /mnt/docker/data/wp-myblog/db/:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: XXXXXXXXXXXXXXXXXX
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress
     networks:
       wordpress:

   wordpress:
     image: wordpress:latest
     restart: always
     volumes:
       - /mnt/docker/data/wp-myblog/wordpress:/var/www/html
     deploy:
       labels:
         - traefik.enable=true
         - traefik.http.routers.wp-myblog-https.rule=Host(`example.com`) && PathPrefix(`/myblog`)
         - traefik.http.routers.wp-myblog-http.rule=Host(`example.com`) && PathPrefix(`/myblog`)
         - traefik.http.routers.wp-myblog-http.entrypoints=http
         - traefik.http.routers.wp-myblog-https.entrypoints=https
         - traefik.http.routers.wp-myblog-https.middlewares=sslheaders@file
         - traefik.http.services.wp-myblog.loadbalancer.server.port=80
         - traefik.http.routers.wp-myblog-https.tls
         - traefik.docker.network=traefik_default
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
       WORDPRESS_CONFIG_EXTRA: |
        define('WP_SITEURL', 'http://example.com/myblog');
        define('WP_HOME','http://example.com/myblog');
     networks:
       traefik_default:
       wordpress:

networks:
  wordpress:
  traefik_default:
    external: true

wp-config.php:

wp-config.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 web site, you can
 * copy this file to "wp-config.php" and fill in the values.
 *
 * This file contains the following configurations:
 *
 * * MySQL settings
 * * Secret keys
 * * Database table prefix
 * * ABSPATH
 *
 * @link https://codex.wordpress.org/Editing_wp-config.php
 *
 * @package WordPress
 */

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress');

/** MySQL database username */
define( 'DB_USER', 'wordpress');

/** MySQL database password */
define( 'DB_PASSWORD', 'wordpress');

/** MySQL hostname */
define( 'DB_HOST', 'db:3306');

/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define( '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',         'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
define( 'SECURE_AUTH_KEY',  'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
define( 'LOGGED_IN_KEY',    'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
define( 'NONCE_KEY',        'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
define( 'AUTH_SALT',        'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
define( 'SECURE_AUTH_SALT', 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
define( 'LOGGED_IN_SALT',   'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
define( 'NONCE_SALT',       'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');

/**#@-*/

/**
 * 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!
 */
$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 Codex.
 *
 * @link https://codex.wordpress.org/Debugging_in_WordPress
 */
define( 'WP_DEBUG', false );

// If we're behind a proxy server and using HTTPS, we need to alert Wordpress of that fact
// see also http://codex.wordpress.org/Administration_Over_SSL#Using_a_Reverse_Proxy
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
        $_SERVER['HTTPS'] = 'on';
}

// WORDPRESS_CONFIG_EXTRA
define('WP_SITEURL', 'http://example.com/myblog');
define('WP_HOME','http://example.com/myblog');

/** That's all, stop editing! Happy publishing. */

/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
        define( 'ABSPATH', dirname( __FILE__ ) . '/' );
}

/** Sets up WordPress vars and included files. */
require_once( ABSPATH . 'wp-settings.php' );

答案1

在 ./wordpress/wp-content 中创建一个名为 blog 的目录,并将所有数据移到其中。然后让你的 docker compose 看起来像

version: '3.7'

networks:
  http_network:
    external: true
  wp:
    external: false

services:
  database:
    image: mariadb:latest
    command: ['--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci', '--default-authentication-plugin=mysql_native_password']
    volumes:
      - .docker/data/db:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    networks:
      - wp

  wordpress:
    depends_on:
      - database
    image: wordpress:latest
    volumes:
      - ./wordpress/wp-content:/var/www/html/wp-content
    environment:
      WORDPRESS_DB_HOST: database:3306
      WORDPRESS_DB_USER: ${MYSQL_USER}
      WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
      WORDPRESS_DB_NAME: ${MYSQL_DATABASE}
    labels:
      - traefik.enable=true
      - traefik.frontend.rule=Host:domain;PathPrefix:/blog
      - traefik.port=80
      - traefik.docker.network=http_network
    working_dir: /var/www/html/wp-content/blog
    networks:
      - wp
      - http_network

现在它有一个奇怪的怪癖,当你第一次配置 wordpress 网站时,你必须转到 https://domain/blog/blog 来完成安装过程。完成后,你应该能够转到 https://domain/blog 并正常访问它。我遇到了同样的问题,/blog/wp-admin 会重定向删除 /blog,但现在却没有。

相关内容