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


nginx codeigniter rewrite: Controller name conflicts with directory

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

我设法使我的编码点火器 url 像在 Apache 中一样工作,除了,我有一个特定的 url 说http://localhost/hello它与站点根目录中的hello目录重合。Apache对此没有问题。但是nginx路由到这个目录而不是控制器。

我的重新路由结构如下

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

所有代码点火器文件都在站点根目录中。

我的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的新手,我需要帮助来解决此目录与控制器名称的冲突。我从网络上的各种来源找到了这个配置,非常感谢任何更好的方法来编写我的配置。

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

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

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

try_files $uri /index.php/$request_uri;

PS$request_uri已经包含一个领先的/

检查维基链接

所以更正确的方法是做

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_files以执行与rewrite相同的操作,因此它将从此更改

try_files $uri /index.php$request_uri;

对此

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

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