Nginx

Nginx - 更改特定 url 的根文件夾會產生 404 錯誤

  • August 12, 2021

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

  • /var/www/html/my-cakephp-app/

+ 行政

 - 配置
 - 安慰
 - 控制器
 - 看法
 - webroot(該目錄下存在App入口點index.php文件)

我也有位於/var/www/html目錄中的靜態 html/css 網站。所以任何有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;
   }
}

我想不出我在第一個伺服器塊上做錯了什麼。任何建議都會非常有幫助。

兩個主要問題是:

  • 除非您使用修飾符,否則外部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應該使用它。

由於這個問題,我避免一起使用aliasand 。請參閱有關使用該指令的注意事項。try_files``if

引用自:https://serverfault.com/questions/1074300