海天无影Blog

UCHOME在nginx下的伪静态出错

/ 4827阅 / 0评 / 0

由于海天的服务器前段时间因为全选问题,ssh连不上去,WEB以及FTP也不能创建文件,没办法只能选择重装系统。由于前段时间工作比较忙,所以一拖再拖,终于再上个星期的周末把服务器重装了,在这里感谢一下vps客服的细心指导以及备份文件。

好了,来说一下本文的重点吧,因为重装了系统,平台也从原来的lnamp换到现在了lnmp,所以网站的伪静态也要跟着一起处理,海天的一个UCHOME网站添加了伪静态后就直接报错,本来是以为htaccess转换出错的,但是后来找了网上的几个nginx下的UChome的伪静态同样被报错。后来海天对比了discuz在nginx下的伪静态规则,发现nginx下的伪静态还是和apache下的除了写法不一样之外,规则也有很多不一样的,我们先来看下apache下的uchome的伪静态:

RewriteEngine On
RewriteBase /
RewriteRule ^(space|network)\-(.+)\.html$ $1.php?rewrite=$2 [L]
RewriteRule ^(space|network)\.html$ $1.php [L]
RewriteRule ^([0-9]+)$ space.php?uid=$1 [L]

然后通过网上的nginx的伪静态规则转换工具http://www.anilcetin.com/convert-apache-htaccess-to-nginx/转换得到:

if ($rule_0 = ""){
rewrite ^/(space|network)-(.+).html$ /$1.php?rewrite=$2 last;
}
if ($rule_1 = ""){
rewrite ^/(space|network).html$ /$1.php last;
}
if ($rule_2 = ""){
rewrite ^/([0-9]+)$ /space.php?uid=$1 last;
}
if ($rule_0 = ""){ rewrite ^/(space|network)-(.+).html$ /$1.php?rewrite=$2 last;}if ($rule_1 = ""){ rewrite ^/(space|network).html$ /$1.php last;}if ($rule_2 = ""){ rewrite ^/([0-9]+)$ /space.php?uid=$1 last;}

将上面转换后得到的规则复制到规则conf文件中,好了,重启nginx的时候,就会提示报错,不能启动nginx,不过我看网上很多人用类似的代码都没有反馈上面,难道他们都可以正常使用?

好了,这里大家都会以为是那个转换程序的错,其实这个只是nginx处理规则和apache不一样罢了(会不会是因为nginx的版本不同的原因?我用的lnmp一键0.9版本),海天对比了discuz的nginx伪静态规则发现,貌似应该是转换后的规则第一条和第二条冲突了,我将第二条去掉以后,就正常启动nginx了,而且网站的访问也没有出错的页面,至此问题解决。

但是,到底什么原因,海天只是认为nginx不能处理类似第一条和第二条这样的同个文件但多个参数的规则。

PS:网上说nginx的伪静态规则不支持正则,原话如下:

原有的url支持正则  重写的url不支持正则
rewrite ^/(\d+)\.home$ /index.html?userId=$1 last;
这个重写中 ^/(\d+)\.home$ 这部分支持正则
而/index.html?userId=$1
不要用正则 也不匹配正则 /index.html?*userId=$1 这样他就会去找.html?*userId=$1这个url 然后给你个404 not found

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注