nginx & php-fpm & 清理 URL

nginx & php-fpm & 清理 URL

你好,我想按照自己的想法设置 nginx。我读了很多手册(包括官方手册),但还是无法让它按我预期的方式工作。

我有以下 URL:/user/register、/user/login、/user/logout 等...没有任何带有 php 文件的 URL。

因此,我想将所有非真实文件 URL 传递到 fast-cgi 服务器。顺便说一句,fpm 在 chroot 中工作。

这是我的配置文件:

 server {

    listen   80; ## listen for ipv4

    server_name  domain;
    root   /var/www/domain/htdocs; 
    include /etc/nginx/security;

    fastcgi_read_timeout 6000;

    location / {
      try_files $uri $uri/ @php-fpm;
    }


    location @php-fpm {
       fastcgi_pass unix:/tmp/php5-fpm.sock;

       include /etc/nginx/fastcgi_params;
       fastcgi_param DOCUMENT_ROOT /htdocs;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       fastcgi_param PATH_INFO $fastcgi_script_name;
    }
}

在 nginx 日志中我看到:

 - - [31/May/2012:16:02:12 +0300] "GET /user/register HTTP/1.1" 403 46 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.46 Safari/536.5"

在 fpm 日志中下一步:

- -  31/May/2012:13:02:12 +0000GET /user/register403 /var/www/domain/htdocs/user/register 0.215 512 0.00%

我有 Ubuntu 12.04 和 nginx 1.1.19

PS 在屏幕上(在浏览器中)我只看到文本“未指定输入文件”。

答案1

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

因此,您可以在日志中看到您配置的内容。您可能想要类似以下内容的内容:

fastcgi_param SCRIPT_FILENAME /path/to/your/script.php;

答案2

您配置错误try_files。正如您在 php-fpm 日志中看到的那样,确切的 URL 被传递给 PHP 服务器,然后服务器尝试获取具有该名称的文件,但该文件当然不存在。

您需要做的是重写或仅更改传递的文件,然后在该脚本中处理给定的 url。

改编自我的 nginx 配置:

try_files $uri $uri/ index.php;


location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/tmp/php5-fpm.sock;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include fastcgi_params;
}

此配置会将所有 .php 文件转发到 php_fpm。如果您不希望 .php 文件直接访问,则需要使用内部的,这会将它们向外界隐藏起来,但大多数情况下你不需要这样做。

使用此配置,所有请求都将转发到index.php。要提取有关用户想要查看的页面的数据,请查看 PHP 的$_SERVER['REQUEST_URI']。如果您要通过该字符串展开/,请记住第一个数组条目将为空。

相关内容