首页 > 解决方案 > 带有 PHP 的子目录的 Nginx 配置返回 404

问题描述

我有一个使用自定义 PHP 框架和加载完全不同框架的 CMS 的网站 www.example.com。它最初是在 apache2 上,现在我正试图转移到 nginx。www 域加载文件,但是在子目录中加载代码库时,它只是在我的 nginx 上返回 404。如果我切换回 apache2,它加载正常。这是我的配置,我基本上是通过查看其他 stackoverflow 答案拼凑而成的:

server {
listen 80 default;
client_max_body_size 256M;
access_log /var/log/nginx/site.access.log;

root /site;
index index.php;

if (!-e $request_filename) {
    rewrite ^.*$ /index.php last;
}

location ~ \.php$ {
    fastcgi_pass php-fpm:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PHP_VALUE "error_log=/var/log/nginx/site_php_errors.log";
    fastcgi_buffers 32 32k;
    fastcgi_buffer_size 64k;
    include fastcgi_params;
}

location /cms {
    root /cms/;
}

location ~ /cms/.+\.php$ {
    fastcgi_pass php-fpm:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PHP_VALUE "error_log=/var/log/nginx/site_php_errors.log";
    fastcgi_buffers 32 32k;
    fastcgi_buffer_size 64k;
    include fastcgi_params;
}

}

我尝试了这个答案,但运气不佳。我必须有一些基本配置设置不正确,但似乎无法弄清楚是哪个。/cms 中的 .htaccess 如下:

RewriteEngine On
RewriteBase /cms

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?request=$1 [L,QSA]

编辑:使用此示例更新了配置,我现在可以登录到 CMS,但它立即进入 302 重定向循环,我无法弄清楚它为什么会发生:

server {
listen 80 default_server;

# client_max_body_size 256M;

root /application;

index index.php;

server_name _;

# access_log /var/log/nginx/application.access.log;

location / {
   try_files $uri $uri/ /index.php$is_args$args;
}

location /cms {
        alias /application/cms;
        try_files $uri $uri/ @cms;

        location ~ \.php$ {
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $request_filename;
            fastcgi_pass php-fpm:9000;
        }
    }

location @cms {
    rewrite /cms/(.*)$ /cms/index.php?/$1 last;
}

location ~ \.php$ {
    include fastcgi_params;
    fastcgi_pass php-fpm:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PHP_VALUE "error_log=/var/log/nginx/application_php_errors.log";
    fastcgi_buffers 32 32k;
    fastcgi_buffer_size 64k;
}

}

标签: phpapachenginx

解决方案


我想我已经在你的实际代码中找到了你的问题,这部分:location ~ \.php$ { 期望找到文件调用.php是你总是有 404 错误的原因。像这样更新:

location ~ index.php$ {
    include fastcgi_params;
    fastcgi_pass php-fpm:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PHP_VALUE "error_log=/var/log/nginx/application_php_errors.log";
    fastcgi_buffers 32 32k;
    fastcgi_buffer_size 64k;
}

我建议您使用:(fastcgi_pass unix:/run/php/php7.1-fpm.sock;请检查/run/php/文件夹上的可用套接字)而不是本地网络调用php-fpm:9000。表现力很强。


推荐阅读