ERR_TOO_MANY_REDIRECTS 在后台 运行 Prestashop 在 Docker

ERR_TOO_MANY_REDIRECTS in backoffice when running Prestashop in Docker

我正在尝试为 Prestashop 项目创建一个 docker 环境。我几乎可以正常工作,但由于某种原因,后台无法访问 - 它给了我一个 ERR_TOO_MANY_REDIRECTS 错误。

我把shop_urltable里的url都改了,改了PS_SHOP_DOMAIN和PS_SHOP_DOMAIN_SSL也没白用。我试图禁用友好的 URL,enable/disable SSL - 但问题仍然存在。

我正在为网络服务器使用自定义图像:

luken-wodby-nginx-prestashop Dockerfile:

FROM wodby/nginx:1.10

ENV WODBY_DIR_FILES /mnt/files

RUN rm /etc/gotpl/default-vhost.conf.tpl && \
    mkdir -p $WODBY_DIR_FILES && \
    mkdir -p /var/log/nginx

COPY prestashop.conf.tpl /etc/gotpl/
COPY init/* /docker-entrypoint-init.d/

docker-compose.yml:

version: "2"

services:
  mariadb:
    image: wodby/mariadb:10.1-2.0.0
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: organic
      MYSQL_USER: prestashop
      MYSQL_PASSWORD: prestashop
    volumes:
      - ./database:/docker-entrypoint-initdb.d
    ports:
      - "33060:3306"

  php:
    image: wodby/php:5.6-2.0.0
    environment:
      PHP_SENDMAIL_PATH: /usr/sbin/sendmail -t -i -S mailhog:1025
      PHP_XDEBUG: 1
      PHP_XDEBUG_DEFAULT_ENABLE: 1
    volumes:
      - ./:/var/www/html

  nginx:
    image: luken-wodby-nginx-prestashop:latest
    depends_on:
      - php
    environment:
      NGINX_BACKEND_HOST: php
      NGINX_SERVER_NAME: prestashop.docker.localhost
      NGINX_SERVER_ROOT: /var/www/html/public_html
    volumes:
      - ./:/var/www/html
    ports:
      - "8000:80"

  mailhog:
    image: mailhog/mailhog
    ports:
      - "8002:8025"

Nginx虚拟主机配置:

server {
    listen 80;
    server_name {{ getenv "NGINX_SERVER_NAME" "prestashop" }};
    root {{ getenv "NGINX_SERVER_ROOT" "/var/www/html/" }};
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    index index.php index.html;

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        auth_basic off;
        allow all;
        log_not_found off;
        access_log off;
    }

    # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 1;
    gzip_buffers 16 8k;
    gzip_http_version 1.0;
    gzip_types application/json text/css application/javascript;

    rewrite ^/api/?(.*)$ /webservice/dispatcher.php?url= last;
    rewrite ^/([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+.jpg$ /img/p//.jpg last;
    rewrite ^/([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+.jpg$ /img/p///.jpg last;
    rewrite ^/([0-9])([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+.jpg$ /img/p////.jpg last;
    rewrite ^/([0-9])([0-9])([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+.jpg$ /img/p/////.jpg last;
    rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+.jpg$ /img/p//////.jpg last;
    rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+.jpg$ /img/p///////.jpg last;
    rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+.jpg$ /img/p////////.jpg last;
    rewrite ^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(-[_a-zA-Z0-9-]*)?(-[0-9]+)?/.+.jpg$ /img/p/////////.jpg last;
    rewrite ^/c/([0-9]+)(-[.*_a-zA-Z0-9-]*)(-[0-9]+)?/.+.jpg$ /img/c/.jpg last;
    rewrite ^/c/([a-zA-Z_-]+)(-[0-9]+)?/.+.jpg$ /img/c/.jpg last;
    rewrite ^/images_ie/?([^/]+).(jpe?g|png|gif)$ /js/jquery/plugins/fancybox/images/. last;
    rewrite ^/order$ /index.php?controller=order last;
    location /panel_adm/ {                           #Change this to your admin folder
        if (!-e $request_filename) {
            rewrite ^/.*$ /panel_adm/index.php last; #Change this to your admin folder
        }
    }
    location / {
        if (!-e $request_filename) {
            rewrite ^/.*$ /index.php last;
        }
    }

    location ~ .php$ {
        fastcgi_split_path_info ^(.+.php)(/.*)$;
        try_files $uri =404;
        fastcgi_keep_conn on;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass backend;  #Change this to your PHP-FPM location
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
   }
}

网站工作正常,只有后台无法访问并出现 ERR_TOO_MANY_REDIRECTS 错误。

有什么想法是错误的吗?

据我所知,在安装时,Prestashop 需要具有完整的文件夹权限,但它会导致这些问题。

例如:

chmod 755 -R /var/www/html

应该完成这项工作。不要忘记在安装后将权限更改为更安全的权限,例如:

chmod 644 -R /var/www/html
chmod 755 -R cache app var modules img

(在@abkrim 对安全发表评论后更新)

我找到了问题的原因。 wodby/nginx nginx 容器正在使用自定义 fastcgi_params 文件。奇怪的是,这个文件没有 fastcgi_param QUERY_STRING $query_string; 行(与 nginx 附带的原始文件相反)。这使得它在默认情况下与您可以在 Internet 上找到的一些现成的 nginx 模板不兼容。它通过未传递给脚本的查询参数表现出来(我在这里为它创建了一个问题:https://github.com/wodby/nginx/issues/3)。

现在,Prestashop 的后台没有一个重要的 controller 参数吓坏了,因为它不知道要 运行 哪个控制器。如果没有控制器,它会使用默认控制器作为参数重定向到 URL,但是因为 Prestashop 从来没有可用的 "controller" 参数,它会在重定向循环中结束,导致 ERR_TOO_MANY_REDIRECTS.

解决此问题的方法是在您的 nginx 配置中添加 fastcgi_param QUERY_STRING $query_string; 以将查询参数传递给脚本。