NGINX try_files没有传递给PHP

时间:2014-05-28 16:32:35

标签: php nginx

我有一个非常简单的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;
}

但这显然不是这样做的方法。

我做错了什么???

2 个答案:

答案 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   
}