nginx codeigniter重写:控制器名称与目录冲突

时间:2013-10-28 07:10:14

标签: php codeigniter url-rewriting nginx

我正在尝试使用nginx并将现有的apache配置移植到nginx。我已成功地重新路由了codeigniter url,但是我遇到了一个特定控制器的问题,该控制器的名称与站点根目录中的目录一致。

我设法让我的codeigniter网址像在Apache中那样工作,除了我有一个特殊的网址说http://localhost/hello与网站根目录中的 hello 目录一致。 Apache对此没有任何问题。但是nginx路由到这个目录而不是控制器。

我的重新路由结构如下

http://host_name/incoming_url => http://host_name/index.php/incoming_url

所有codeigniter文件都在站点根目录中。

我的nginx配置(相关部分)

server {

listen   80; ## listen for ipv4; this line is default and implied
#listen   [::]:80 default ipv6only=on; ## listen for ipv6

root /path/to/site/root;
index index.php index.html index.htm;

# Make site accessible from http://localhost/
server_name localhost;

location / {
    # First attempt to serve request as file, then
    # as directory, then fall back to index.html

    index index.php index.html index.htm;

    try_files $uri $uri/ /index.php/$request_uri;

    #apache rewrite rule conversion

    if (!-e $request_filename){
        rewrite ^(.*)/?$ /index.php?/$1 last;
    }

    # Uncomment to enable naxsi on this location
    # include /etc/nginx/naxsi.rules
}

location ~ \.php.*$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

    # With php5-cgi alone:
    fastcgi_pass 127.0.0.1:9000;
    # With php5-fpm:
    #fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
}

我是nginx的新手,我需要帮助找出与Controller名称冲突的目录。我从网络上的各种来源中找到了这种配置,并且非常感谢任何更好的编写配置的方式。

1 个答案:

答案 0 :(得分:2)

你的问题是你告诉nginx在将文件夹传递给主控制器之前检查文件夹是否存在

try_files $uri ($uri/) /index.php/$request_uri;
                 |
             this part

您可以通过告诉nginx不要查找文件夹来修复它,只需删除该部分

即可
try_files $uri /index.php/$request_uri;

PS $request_uri已包含前导/

check the wiki link

所以更正确的方法是

try_files $uri /index.php$request_uri;

PS#2

#apache rewrite rule conversion

if (!-e $request_filename){
    rewrite ^(.*)/?$ /index.php?/$1 last;
}

应删除此部分,try_files语句已处理此部分并执行完全相同的操作。

我也相信在删除此行后您的网站仍然可以使用

fastcgi_index index.php;

和这个

fastcgi_split_path_info ^(.+\.php)(/.+)$;

我从未真正使用过这些。

您的配置缺少root,我认为这就是您需要这些线路的原因。

修改

正如您所说,如果删除重写,网站无效,我注意到try_filesrewrite语句之间存在细微差别,我们需要修复try_filesrewrite所做的事情,所以它会从这个

改变
try_files $uri /index.php$request_uri;

到此

try_files $uri /index.php/?$request_uri;

之后,重写应该可以删除。