我正在尝试为任何人通过mydomain.com/game/admin
url 安排一个位置块,确保用于提取内容的 nginx 服务器存在于/var/www/html/my-cakephp-app/
目录中。我的应用程序是使用 cakephp 框架构建的,其目录结构如下所示:
- /var/www/html/my-cakephp-app/
- 行政
- 配置
- 安慰
- 控制器
- 看法
- webroot(该目录下存在App入口点index.php文件)
我也有位于/var/www/html
目录中的静态 html/css 网站。所以任何有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;
}
}
我想不出我在第一个服务器块上做错了什么。任何建议都会非常有帮助。
两个主要问题是:
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
指令。有关详细信息,请参阅此文档。请注意,这
$document_root$fastcgi_script_name
将不适用,alias
而$request_filename
应该使用它。由于这个问题,我避免一起使用
alias
and 。请参阅有关使用该指令的注意事项。try_files
if