我正在尝试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_files
和rewrite
语句之间存在细微差异,我们需要修复try_files
以执行与rewrite
相同的操作,因此它将从此更改
try_files $uri /index.php$request_uri;
对此
try_files $uri /index.php/?$request_uri;
之后,重写应该可以删除。