[英]NGINX try_files does not pass to PHP
我有一個非常簡單的PHP站點:
.
├── about.php
├── index.php
├── project
│ ├── project_one.php
│ └── project_two.php
└── projects.php
以下nginx配置(僅顯示相關部分):
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/path/to/php.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_intercept_errors on;
}
location / {
index index.php;
try_files $uri $uri/ $uri.php =404;
}
擊中/
按預期工作。 點擊任何http://my.site.com/{projects | about | project/*}
http://my.site.com/{projects | about | project/*}
http://my.site.com/{projects | about | project/*}
URL應使用try_files命中$uri.php
文件,並將其傳遞給PHP。 但相反,瀏覽器只是下載PHP文件本身。
我可以通過為上述位置添加單獨的位置指令來實現它,如下所示:
location /projects {
try_files $uri $uri/ /$uri.php;
}
location /about {
try_files $uri $uri/ /$uri.php;
}
location /project {
try_files $uri $uri/ $uri.php;
}
但這顯然不是這樣做的方法。
我究竟做錯了什么???
每個nginx文檔的try_files
檢查指定順序的文件是否存在,並使用第一個找到的文件進行請求處理; 處理在當前上下文中執行
所以nginx找到PHP文件並在location /
therefor的上下文中處理它只是將它作為靜態文件提供。 只有最后一個參數不同,它沒有被檢查,但是nginx進行內部重定向(如果它是uri)或返回錯誤代碼(如果它是=code
)。 因此,您需要從try_files中刪除=404
以進行內部重定向。 並將try_files
添加到location ~ \\.php
以確保該文件存在。
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/path/to/php.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_intercept_errors on;
}
location / {
index index.php;
try_files $uri $uri/ $uri.php;
}
試試這個:
location / {
try_files $uri $uri/ /index.php;
index index.php;
## output: http://my.site.com/about
rewrite ^/about$ /about.php last;
## output: http://my.site.com/projects
rewrite ^/projects$ /projects.php last;
## output: http://my.site.com/projectOne
rewrite ^/projectOne$ /project/project_one.php last;
## output: http://my.site.com/projectTwo
rewrite ^/projectTwo$ /project/project_two.php last;
}
更新:
location / {
try_files $uri $uri/ /index.php;
index index.php;
rewrite ^(.*)$ /$1.php; # WITHOUT PHP EXTENSION
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.