Nginx
Nginx - 更改特定 url 的根文件夾會產生 404 錯誤
我正在嘗試為任何人通過
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
指令。有關詳細資訊,請參閱此文件。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
應該使用它。