php - 带有 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;
}
}
解决方案
我想我已经在你的实际代码中找到了你的问题,这部分: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
。表现力很强。
推荐阅读
- react-native - Firebase 更新错误:存储在 Firestore 中的日期对象的行为将发生变化,您的应用可能会中断
- sql - sql - 检查列是否以特定的正则表达式开头
- android - 从 onPostExecute 获取 JSON 字符串到 OnCreateView
- php - Uncaught ReferenceError: $ is not defined - Laravel 5.5 + Laravel Mix
- react-native - 如何升级 react-native gradle 版本
- javascript - 无法动态创建 div 内容
- proxy - Node.js 中的 Google GAX / gRPC 不适用于 HTTP/S 代理
- javascript - 如何将点分隔字符串中的每个第一个单词大写?
- c - C:如何获取操作系统名称(Ubuntu、Debian、Centos、..)以及如果定义操作系统名称 = ubuntu
- jenkins - 如何在 Jenkins Blue Ocean 阶段为 Github 状态检查指定自定义 url?