2013-01-02 37 views
0

我需要得到这个工作对nginx的用PHP-FPM:nginx的PATH_INFO

example.com/studip/dispatch.php/admin/user/ 

这个问题似乎是,那/ studip不是根下的子文件夹,但一个别名到/ usr /本地/ studip /公/

这里的无(无工作)的配置PATH_INFO富:

server { 
    listen 80; 
    server_name example.com; 

    root /var/www/example.com/htdocs; 
    index index.php 

    # Here are a few other subfolders hosted 
    # ... 
    # ... 

    # and now studip: 

    location /studip { 
     alias /usr/local/studip/public/; 
     index index.php; 
     location ~ /studip/(.*\.php)$ { 
      fastcgi_pass unix:/var/www/sockets/studip.socket; 
      fastcgi_index index.php; 
      fastcgi_param SCRIPT_FILENAME $document_root$1; 
      include fastcgi_params; 
     } 
    } 
} 

而且fastcgi_params:

fastcgi_param QUERY_STRING   $query_string; 
fastcgi_param REQUEST_METHOD   $request_method; 
fastcgi_param CONTENT_TYPE   $content_type; 
fastcgi_param CONTENT_LENGTH   $content_length; 

fastcgi_param SCRIPT_FILENAME   $request_filename; 
fastcgi_param SCRIPT_NAME    $fastcgi_script_name; 
fastcgi_param REQUEST_URI    $request_uri; 
fastcgi_param DOCUMENT_URI   $document_uri; 
fastcgi_param DOCUMENT_ROOT   $document_root; 
fastcgi_param SERVER_PROTOCOL   $server_protocol; 

fastcgi_param GATEWAY_INTERFACE  CGI/1.1; 
fastcgi_param SERVER_SOFTWARE   nginx/$nginx_version; 

fastcgi_param REMOTE_ADDR    $remote_addr; 
fastcgi_param REMOTE_PORT    $remote_port; 
fastcgi_param SERVER_ADDR    $server_addr; 
fastcgi_param SERVER_PORT    $server_port; 
fastcgi_param SERVER_NAME    $server_name; 

fastcgi_param HTTPS     $https; 

# PHP only, required if PHP was built with --enable-force-cgi-redirect 
fastcgi_param REDIRECT_STATUS   200; 

fastcgi_buffers 8 16k; 
fastcgi_buffer_size 32k; 

我尝试了一个子域,其中根点到/ usr /本地/ studip /公/和获得它的工作与此PARAMS:

location/{ 
    try_files $uri $uri/ /index.php; 
} 

location ~ \.php { 
    fastcgi_split_path_info ^(.+\.php)(/.+)$; 

    fastcgi_param PATH_INFO   $fastcgi_path_info; 
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; 

    fastcgi_param QUERY_STRING  $query_string; 
    fastcgi_param REQUEST_METHOD  $request_method; 
    fastcgi_param CONTENT_TYPE  $content_type; 
    fastcgi_param CONTENT_LENGTH  $content_length; 

    fastcgi_param SCRIPT_NAME  $fastcgi_script_name; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_param REQUEST_URI  $request_uri; 
    fastcgi_param DOCUMENT_URI  $document_uri; 
    fastcgi_param DOCUMENT_ROOT  $document_root; 
    fastcgi_param SERVER_PROTOCOL $server_protocol; 

    fastcgi_param GATEWAY_INTERFACE CGI/1.1; 
    fastcgi_param SERVER_SOFTWARE nginx; 

    fastcgi_param REMOTE_ADDR  $remote_addr; 
    fastcgi_param REMOTE_PORT  $remote_port; 
    fastcgi_param SERVER_ADDR  $server_addr; 
    fastcgi_param SERVER_PORT  $server_port; 
    fastcgi_param SERVER_NAME  $server_name; 

    fastcgi_pass unix:/var/www/sockets/www.socket; 
    fastcgi_index index.php; 
} 

但我不知道如何端口这到子文件夹。

有什么建议吗?

+0

如果您使用重写规则删除前端控制器,如“index.php”。你实际上会得到空的PATH_INFOs ......这可能搞砸了某些框架,比如Codeigniter。在设置它们之前,我们应该测试路径信息的存在。 – CMCDragonkai

回答

2

因此,这里就是你要做的:

对于FCGI,不设置fix_pathinfo以0作为推荐!这会导致访问被拒绝状态。相反,请确保这个cgi.fix_pathinfo = 1或被注释掉在你的php.ini文件中。

接下来,在的场所,进入你的nginx的站点配置文件中的一个使用这种先进的所在地块:

location ~ [^/]\.php(/|$) { 
    fastcgi_split_path_info ^(.+?\.php)(/.*)$; 
    if (!-f $document_root$fastcgi_script_name) { 
     return 404; 
    } 

    fastcgi_pass unix:/var/run/php5-fpm.sock; 
    fastcgi_index index.php; 
    include fastcgi_params; 
    fastcgi_param PATH_INFO $fastcgi_path_info; 
} 

如果你不及格的插座和本地IP逝去,使用此fastcgi_pass代替:

fastcgi_pass 127.0.0.1:9000;

在您的fastcgi_params版本中,从SCRIPT_FILENAME变量的前面删除$ document_root。即使在子目录中也没有必要。

这应该做到这一点。在使用PHP5的Ubuntu 13.10上是否适合我。