![Nginx - 更改特定 URL 的根文件夹会导致 404 错误](https://linux22.com/image/769408/Nginx%20-%20%E6%9B%B4%E6%94%B9%E7%89%B9%E5%AE%9A%20URL%20%E7%9A%84%E6%A0%B9%E6%96%87%E4%BB%B6%E5%A4%B9%E4%BC%9A%E5%AF%BC%E8%87%B4%20404%20%E9%94%99%E8%AF%AF.png)
我正在尝试为任何通过mydomain.com/game/admin
url 获取的人安排一个位置块,确保要拉取内容的 nginx 服务器存在于/var/www/html/my-cakephp-app/
目录中。我的应用程序是使用 cakephp 框架构建的,其目录结构如下所示:
- /var/www/html/我的cakephp应用程序/
- 行政
- 配置
- 安慰
- 控制器
- 看法
- webroot(应用程序入口点 index.php 文件存在于此目录中)
另外,我在目录中有一个静态 html/css 网站/var/www/html
。因此任何知道mydomain.com
url 的人都可以看到该网站。
这是我当前的 nginx 服务器块:
server {
listen 80;
listen [::]:80;
root /var/www/html;
index index.html index.htm index.php;
server_name mydomain.com;
location / {
try_files $uri $uri/ =404;
}
location /game/admin {
return 301 /game/admin/;
}
location /game/admin/ {
root /var/www/html/my-cakephp-app/admin/webroot;
try_files $uri $uri/ /game/admin/index.php$is_args$args;
location ~* \.php(/|$) {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
使用此设置,我的静态网站可以正常工作。但 cakephp 应用程序在浏览器中显示 404 not found 错误。nginx/error.log 中没有任何错误。
但是当我使用以下 nginx 配置运行时,我的应用程序运行良好。但我必须摆脱我的 html/css 网站。我计划使用 wordpress 网站升级 html/css 应用程序。所以我应该能够将 wordpress 网站作为父级运行。
server {
listen 80;
server_name mydomain.com;
root /var/www/html/my-cakephp-app/admin/webroot;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ /index.php$is_args$args;
autoindex on;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
我想不出第一个服务器块做错了什么。任何建议都会很有帮助。
答案1
两个主要问题是:
- 除非使用修饰符,否则外部
location ~ \.php$
块优先于块(请参阅location /game/admin/
^~
这个文件了解详情) - 该
root
指令通过简单的连接生成文件的路径,因此您的控制器应该位于/var/www/html/my-cakephp-app/admin/webroot/game/admin/index.php
(参见这个文件了解详情)
一个选项是移动项目,使目录结构与 URI 结构相匹配。这可以使用指向的符号链接/var/www/html/game/admin
来实现,/var/www/html/my-cakephp-app/admin/webroot
在这种情况下,外部location ~ \.php$
块将能够执行这两个项目。
另一个选项是alias
指令。请参阅这个文件了解详情。
location ^~ /game/admin {
alias /var/www/html/my-cakephp-app/admin/webroot;
if (!-e $request_filename) { rewrite ^ /game/admin/index.php last; }
location ~ \.php$ {
if (!-f $request_filename) { return 404; }
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
}
请注意,$document_root$fastcgi_script_name
将不适用于alias
,而$request_filename
应改用。