0

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

我设法使我的 codeigniter url 像在 Apache 中一样工作,除了我有一个特定的 url 说它http://localhost/hellohello站点根目录中的目录一致。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 的新手,我需要帮助来找出这个目录与控制器名称的冲突。我从网络上的各种来源中找到了这个配置,非常感谢任何更好的方式来编写我的配置。

4

1 回答 1

2

您的问题是您告诉 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)(/.+)$;

我从来没有真正使用过这些。

而且您的配置缺少 a root,我认为这就是您需要这些行的原因。

编辑:

正如您提到的,如果删除了重写,网站将无法运行,我注意到 the 和语句之间存在细微差别,try_files我们rewrite需要修复try_filesrewrite

try_files $uri /index.php$request_uri;

对此

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

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

于 2013-10-28T09:03:44.857 回答