一个愚蠢的原因导致的lighttpd的404错误

这几天学习Rails的部署,被Robbin大大的[url=http://www.iteye.com/topic/43228]在 Linux 平台上安装和配置 Ruby on Rails 详解 [/url]说的热血沸腾,摩拳擦掌准备用lighttpd + FastCGI试试部署。不得不说走前辈的路就是比较平坦。全部配置完后,启动lighttpd服务器,问题来了,访问静态页面都没问题,但动态页面都是显示404页面。

然后查找原因:
dispatch.fcgi确实有执行权限,用控制台手动调用也可以正确返回结果;
errorlog没问题,accesslog记录一堆404,也算正常;
Rails的log就根本什么都没记,说明根本Rails分发器没被触发;
查看进程,确实启动了一个lighttpd服务器进程,和几个dispatch.fcgi进程。
最后发现是lighttpd.conf中把$HTTP["host"]写错了。

因为只是试试部署,Rails设定的是development环境,项目也在本机,
所以lighttpd.conf配置文件如下:

$HTTP["host"] == "127.0.0.1" {
server.document-root = "/yourrails/public"
server.error-handler-404 = "/dispatch.fcgi"
fastcgi.server = (".fcgi" =>
("localhost" =>
("minprocs" => 10,
"maxprocs" => 10,
"socket" => "/tmp/rails.socket",
"bin-path" => "/yourrails/public/dispatch.fcgi",
"bin-environment" => ("RAILS_ENV" => "development")
)
)
)
}

我在浏览器中敲的动态页面网址是:http://localhost/test

问题就在这句上
$HTTP["host"] == "127.0.0.1"

lighttpd认为"127.0.0.1"和"localhost"是不同的地址……所以,url里只有用"127.0.0.1",lighttpd才能正确识别这是该调用Rails分发器,而不是直接抛404错误的。
解决方法很简单,改成以下两种形式的任一种就行了:

# 第一种,完全匹配
$HTTP["host"] == "localhost"
# 第二种,正则匹配
$HTTP["host"] =~ "^localhost"


顺便说说这两种方式的区别:
$HTTP["host"] == "localhost" 这种方式可以匹配localhost加任意端口,如果Rails项目没有使用子域名的话,这种写法是最简单也最不容易出错的。
$HTTP["host"] =~ "^localhost" 这种方式是把域名+端口号和正则表达式做匹配的,所以这种正则"^localhost$"是不匹配"http://localhost:3000"的,想完全匹配只能用"^localhost\:3000$"。当然实际情况中没人会把正则写的这么死,这只是举例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值