Nginx - 更改特定 url 的根資料夾會出現 404 錯誤

Nginx - 更改特定 url 的根資料夾會出現 404 錯誤

我正在嘗試為任何通過mydomain.com/game/adminurl 的人安排一個位置區塊,確保用於提取內容的 nginx 伺服器存在於/var/www/html/my-cakephp-app/目錄中。我的應用程式是使用cakephp框架建立的,其目錄結構如下所示:

  • /var/www/html/my-cakephp-app/
    • 行政
      • 配置
      • 安慰
      • 控制器
      • 看法
      • 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 未找到錯誤。 nginx/error.log 中沒有任何錯誤。

但是當我使用以下 nginx 配置運行時,我的應用程式工作正常。但我必須擺脫我的 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不能與 一起使用,而應該使用aliasthat來代替。$request_filename

我避免將aliastry_files一起使用,因為這個問題。看這個警告關於該指令的使用if

相關內容