
我正在嘗試為任何通過mydomain.com/game/admin
url 的人安排一個位置區塊,確保用於提取內容的 nginx 伺服器存在於/var/www/html/my-cakephp-app/
目錄中。我的應用程式是使用cakephp框架建立的,其目錄結構如下所示:
- /var/www/html/my-cakephp-app/
- 行政
- 配置
- 安慰
- 控制器
- 看法
- webroot(應用程式入口點index.php檔案存在於此目錄中)
我的目錄中還有靜態 html/css 網站/var/www/html
。因此任何知道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 未找到錯誤。 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
不能與 一起使用,而應該使用alias
that來代替。$request_filename