我有一个非常简单的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/*}
网址应使用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;
}
但这显然不是这样做的方法。
我做错了什么???
答案 0 :(得分:10)
{n {3}}
的每个nginx文档检查指定顺序的文件是否存在,并使用第一个找到的文件进行请求处理; 处理在当前上下文中执行
所以nginx找到PHP文件并在location /
的上下文中处理它,因此只需将其作为静态文件提供。只有最后一个参数不同,它没有被检查,但是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;
}
答案 1 :(得分:1)
试试这个:
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
}