当 WordPress 在子文件夹中时无法访问管理员

Can’t access admin when WordPress is in a subfolder

我使用 this Docker image. I installed WordPress in a sub-folder (https://thibault.vlacich.fr/blog).

安装了 WordPress

我正在使用 Traefik 进行路由。这是我的 docker-compose 文件:

version: '3.7'

networks:
  http_network:
    external: true
  thibaultvlacich:
    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:
      - thibaultvlacich

  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:thibault.vlacich.fr;PathPrefix:/blog;PathPrefixStrip:/blog
      - traefik.port=80
      - traefik.docker.network=http_network
    networks:
      - thibaultvlacich
      - http_network

除管理员外,一切正常。当我进入https://thibault.vlacich.fr/blog/wp-admin, I’m redirected to https://thibault.vlacich.fr/wp-admin,然后无法访问管理员。

知道如何解决这个问题吗? (WP_HOME 和 WP_SITEURL 都正确设置为 https://thibault.vlacich.fr/blog

我 运行 遇到了与您完全相同的问题。我断断续续地进行了数周的故障排除,并在试图解决这个问题时失去了一半的头发。我想我终于明白了。

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

version: '3.7'

networks:
  http_network:
    external: true
  thibaultvlacich:
    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:
      - thibaultvlacich

  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:thibault.vlacich.fr;PathPrefix:/blog
      - traefik.port=80
      - traefik.docker.network=http_network
    working_dir: /var/www/html/wp-content/blog
    networks:
      - thibaultvlacich
      - http_network

现在它有一个奇怪的怪癖,我认为你不会有问题,因为你已经起床 运行。当您第一次配置 wordpress 站点时,您必须转到 https://thibault.vlacich.fr/blog/blog to go through the installation process. When complete you should be able to go to https://thibault.vlacich.fr/blog 并正常访问它。我遇到了同样的问题,其中 /blog/wp-admin 会重定向删除 /blog,但现在我没有。如果这不起作用,请告诉我,我会 post 我的 docker-compose.yml 文件,您可以修改您的文件以匹配。

我在 docker-compose 中找到了这个配置。 通过将所有内容都放在 /var/www/html/SUBFOLDER_NAME 中的子文件夹下 它解决了 /wp-admin.php 页面的重定向问题。

以下是 wordpress 的 docker-compose 部分,我的 SUBFOLDER_NAME 为 'blog'。

### Wordpress ###########################################
wordpress:
  image: wordpress:latest
  restart: always
  environment:
    WORDPRESS_DB_HOST: mysql
    WORDPRESS_DB_USER: root
    WORDPRESS_DB_PASSWORD: root
    WORDPRESS_DB_NAME: test
    WORDPRESS_CONFIG_EXTRA: 
      |
      define ( 'WP_SITEURL', 'http://localhost/blog' );
      define ( 'WP_HOME', 'http://localhost/blog' );
  volumes:
    - ./wordpress/blog:/var/www/html/blog
  depends_on:
    - mysql
  networks:
    - frontend
    - backend
  working_dir: /var/www/html/blog
  labels:
    - traefik.enable=true
    - traefik.frontend.rule=Host:localhost;PathPrefix:/blog
    - traefik.port=80

嗨,我的 Traefik V2

解决方案
version: '3'

services:
  db:
    image: mysql:8.0
    container_name: blog_db
    restart: always
    env_file: .env
    environment:
      - MYSQL_DATABASE=blog
    volumes:
      - dbdata:/var/lib/mysql
    command: '--default-authentication-plugin=mysql_native_password'
    networks:
      - app-network

  wordpress:
    depends_on:
      - db
    build: .
    container_name: wordpress
    restart: always
    environment:
      WORDPRESS_DB_HOST: blog_db:3306
      WORDPRESS_DB_USER: $MYSQL_USER
      WORDPRESS_DB_PASSWORD: $MYSQL_PASSWORD
      WORDPRESS_DB_NAME: blog

    volumes:
      - ./wordpress:/var/www/html/blog
    networks:
      - app-network
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=proxy"
      - "traefik.http.routers.blog.entrypoints=websecure"
      - "traefik.http.routers.blog.rule=(Host(`example.com`) && PathPrefix(`/blog{regex:$$|/.*}`))"
      - "traefik.http.routers.blog.priority=10"
      - "traefik.http.services.blog.loadbalancer.server.port=80"
      - "traefik.http.routers.blog.tls=true"
      - "traefik.http.routers.blog.tls.certresolver=cloudflare"



volumes:
  dbdata:

networks:
  app-network:
    driver: bridge
  proxy:
    external: true

或者,您可以在不创建子文件夹的情况下尝试此操作。尝试在 wp-config.php

中添加以下行
$_SERVER['REQUEST_URI'] = str_replace("/wp-admin/", "/blog/wp-admin/",  $_SERVER['REQUEST_URI']);

可能的解决方案:

用这个来组成: 更改 SOME_LOCAL_IN_YOUR_SERVER 服务器中的路径和 mkdir 2 文件夹(db 和 wpdata)

version: '3'
    
services:
       db:
         image: mysql:5.7
         volumes:
           - /SOME_LOCAL_IN_YOUR_SERVER/db:/var/lib/mysql
         networks:
           - wordpress
         environment:
           MYSQL_ROOT_PASSWORD: somewordpress
           MYSQL_DATABASE: wordpress
           MYSQL_USER: wordpress
           MYSQL_PASSWORD: wordpress
       wordpress:
         depends_on:
           - db
         image: wordpress:latest
         environment:
           WORDPRESS_DB_HOST: db:3306
           WORDPRESS_DB_USER: wordpress
           WORDPRESS_DB_PASSWORD: wordpress
         volumes:
            - /SOME_LOCAL_IN_YOUR_SERVER/wpdata:/var/www/html 
         networks:
            - traefik-public
            - wordpress
         labels:
                - 'traefik.enable=true'
                - 'traefik.docker.network=traefik-public'
                - 'traefik.http.routers.blog.rule=Host(`your.site.com`) && PathPrefix(`/blog`)'
                - 'traefik.http.routers.blog.entrypoints=websecure' 
           
    volumes:
        db_data:
        
    networks:
        traefik-public:
           external: true
        wordpress:

撰写以在 wpdata 目录中填充 wp 数据

在wpdata文件夹中输入:

cd /SOME_LOCAL_IN_YOUR_SERVER/wpdata

编辑 wp-config.php 并插入这两行:

define('WP_HOME','your.site.com/blog');
define('WP_SITEURL','your.site.com/blog');

在 wpdata 中创建博客目录:

mkdir blog

将wpdata中的所有内容复制到wpdata/blog:

cp * -R blog/

编辑 index.php(在 wpdata 目录中,不是博客目录版本)

require( dirname( __FILE__ ) . '/wp-blog-header.php' );
must be:
require( dirname( __FILE__ ) . '/blog/wp-blog-header.php' );

基于:https://blog.sakuragawa.moe/containerized-wordpress-from-sub-directory/ and https://wordpress.org/support/article/giving-wordpress-its-own-directory/#method-ii-with-url-change