Nginx - 更改特定 URL 的根文件夹会导致 404 错误

Nginx - 更改特定 URL 的根文件夹会导致 404 错误

我正在尝试为任何通过mydomain.com/game/adminurl 获取的人安排一个位置块,确保要拉取内容的 nginx 服务器存在于/var/www/html/my-cakephp-app/目录中。我的应用程序是使用 cakephp 框架构建的,其目录结构如下所示:

  • /var/www/html/我的cakephp应用程序/
    • 行政
      • 配置
      • 安慰
      • 控制器
      • 看法
      • webroot(应用程序入口点 index.php 文件存在于此目录中)

另外,我在目录中有一个静态 html/css 网站/var/www/html。因此任何知道mydomain.comurl 的人都可以看到该网站。

这是我当前的 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应改用。

我避免同时使用alias和,try_files因为这个问题。 看这种警告关于该指令的使用if

相关内容