2014-06-24
灵活地变动Nginx 的默认文档“index” 值

为什么会有这个需求?还不是因为BA的问题… 接到“内容不符”的通知,要么滚要么大改。运营上线已久,大改不现实,滚到外地的话即浪费资金又不利于国内优秀资源的使用。冒险用上这招,继续低调行事… 得益于linux 平台及强大nginx,还有被Q了的Google,最终才能使方案得以顺利实现。码文记录也顺便分享给有需要的朋友,虽然过分很简单,但真的很有用。对于nginx 的理解仍然是冰山一角!

需求及思路

用户访问www.xxx.com 时,需要展示“符合要求”的内容,而用户入口非www.xxx.com 时则展示“不太符合要求”的内容。 方案一: 这个第一时间想到的,就是新建目录,把现有内容放置在新目录下并绑定二级域名继续使用,而根目录随意放置一个静态文件供展示就可以了。 弊端:工作量相对大了;整站放置在二级目录,不知道会不会影响其他已绑定二级域名的子频道;不利于日后大动作。 方案二: 根据来访域名,动态变换主页。nginx 可以用set 来设置变量,简单!方便!快捷!

方案实施

最终实现预期功能的nginx 这一小段 配置文件如下:

if ($host = ‘www.xxx.com') {
set $index “default.php”;
set $index_more “index.php”;
}
if ($host != ‘www.xxx.com') {
set $index “index.php”;
set $index_more “default.php”;
}
index $index index.htm $index_more;
# index index.html index.htm index.php;

也就是$host 为www.xxx.com 时,index 最优先的默认文档为default.php。当$host 不是www.xxx.com 时,则优先使用原来的index.php! 修改保存后,使用nginx -t测试提示successful。然后通过nginx -s reload重新加载nginx 配置。大功告成!


*这里新增加一个$index_more 的变量(variable)是折衷的办法,当我使用如下判断时,遇到了403 错误:

if ($host = ‘www.xxx.com') {
set $index “default.php index.htm index.php”;
}
if ($host != ‘www.xxx.com') {
set $index “index.php index.htm default.php”;
}
index $index;
# index index.html index.htm index.php;

似乎是因为变量赋值出现空格而导致了403。度娘无解,Google 也不知道怎么描述具体问题,有机会的话,还想去stackoverflow 咨询一下。如果有朋友知晓个中缘由的,希望能分享一下解决方法。

Read More

2014-04-11
Nginx 泛解析实现二级(多)域名,自动设置root 绑定到对应子目录

如根目录结构为 /htdocs ├── bbs └── www 要实现绑定域名bbs.domain.com 到bbs 目录,www.domain.com 到www 目录,规则如下:

server {
listen 80;
server_name ~^(?.+)\.domian\.com$;
root htdocs/$subdomain;
error_page 404 /error.html;
location /error.html {
root /htdocs;
}

}

三级域名,更多子域名设置类似。

Read More

2014-04-10
Discuz Nginx 301 重定向规则,解决二级域名多入口问题

Discuz 在启用了版块或者频道的二级域名时,可通过改二级域名访问论坛的url并且不会自动纠正,似乎不太友好。之前用apache 也写了rewrite 规则实现重定向,但现在切换至nginx,需要重新配置一下,但也很简单: 原来的apache rewrite 规则:

RewriteCond %{HTTP_HOST} ^a.domain.com$
RewriteRule ^thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ http://www.domain.com/thread-$1-$2-$3.html [L,R=301]
RewriteRule ^forum.php(.)$ http://www.domain.com/forum.php$1 [L,R=301]
RewriteRule ^archiver(.
)$ http://www.domain.com/archiver$1 [R=301,L]

nginx 规则:

if ($host != ‘www.domian.com')
{
rewrite ^/forum.php(.)$ http://www.domain.com/forum.php$1 permanent;
rewrite ^/forum-(.
)$ http://www.domain.com/forum-$1 permanent;
rewrite ^/thread-(.)$ http://www.domain.com/thread-$1 permanent;
rewrite ^/archiver(.
)$ http://www.domain.com/archiver$1 permanent;
}

因为是多个二级域名的关系,所以将所有$host 不是“www.domain.com” 都rewrite 到“www.domain.com” 下面。将这段规则放到Discuz 生成的规则上面就好了。 看一下效果:

ying@ying-desktop:~/Desktop$ wget http://a.domian.com/thread-18513-1-1.html--2014-04-10 13:28:56– http://a.domain.com/thread-18513-1-1.html
正在解析主机 a.domain.com (a.domain.com)… 114.215.101.226
正在连接 a.domain.com (a.domain.com)|114.215.101.226|:80… 已连接。
已发出 HTTP 请求,正在等待回应… 301 Moved Permanently
位置:http://www.domain.com/thread-18513-1-1.html [跟随至新的 URL]
–2014-04-10 13:28:57– http://www.domain.com/thread-18513-1-1.html
正在解析主机 www.domian.com (www.domain.com)... 114.215.101.226
再次使用存在的到 a.domain.com:80 的连接。
已发出 HTTP 请求,正在等待回应… 200 OK
长度: 未指定 [text/html]
正在保存至: “thread-18513-1-1.html”

\[     <=\>                               \] 106,477      100KB/s   用时 1.0s
Read More