我正在尝试使用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名称冲突的目录。我从网络上的各种来源中找到了这种配置,并且非常感谢任何更好的编写配置的方式。
答案 0 :(得分: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)(/.+)$;
我从未真正使用过这些。
您的配置缺少root
,我认为这就是您需要这些线路的原因。
修改强>
正如您所说,如果删除重写,网站无效,我注意到try_files
和rewrite
语句之间存在细微差别,我们需要修复try_files
做rewrite
所做的事情,所以它会从这个
try_files $uri /index.php$request_uri;
到此
try_files $uri /index.php/?$request_uri;
之后,重写应该可以删除。