在Ngnix中如果用变量作为反向代理的地址时,容易出现“no resolver defined to resolve xxx.xxx”的问题,例如:
- server
- {
- listen 80;
- server_name ~^(.*).lib.ecjtu.net$;
- access_log /var/log/nginx/access-lib_ecjtu.log;
- set $key $1;
- location /{
- auth_basic "What's your password?";
- auth_basic_user_file /www/lib_ecjtu_net/htpasswd;
- proxy_pass http://$key;
- }
- }
不少网站页面习惯于在URL中的目录名后不加斜杠“/”,这在在apache下会自动添加一个斜杠从而不会造成什么问题,但是如果URL中的二级目录名后不加斜杠的话在Nginx下就会出现403 Forbidden的问题。在网上找到的比较可靠的原因供以想深究的TX进行参考:
在某些情况下(具体可参考 wiki.nginx.org),Nginx 内部重定向规则会被启动,例如,当 URL 指向一个目录并且在最后没有包含“/”时,Nginx 内部会自动的做一个 301 重定向,这时会有两种情况:
1、 server_name_in_redirect on(默认),URL 重定向为: server_name 中的第一个域名 + 目录名 + /;
2、 server_name_in_redirect off,URL 重定向为: 原 URL 中的域名 + 目录名 + /。
当你有多个 域名要指向同一个虚拟主机,并且你自己写 301 重定向规则把它们合并到某一个域名时,情况就更复杂了:
首先,nginx 检查 URL,如果符合条件,就用该规则(你写的)做第一遍重定向,接着,检查新生成的 URL,如果符合内部自动重定向之条件,就用前面提到的规则再做一次重定向。
至于 PHP 的 $_SERVER["SERVER_NAME"],在 nginx 中默认是由 nginx 的变量 $server_name 提供,这时它和重定向没有关系,始终是 server_name 设置中的第一个域名,但这是可以被改变的,在你的 nginx 配置中找到 fastcgi_param 部分,修改
fastcgi_param SERVER_NAME $server_name;
为
fastcgi_param SERVER_NAME $host;
但 现在就要注意了,此时的 $_SERVER["SERVER_NAME"] 会受你写的和 nginx 自己的重定向规则所影响而变化。
现 在就清楚了,如果 MediaWiki 是通过 $_SERVER["SERVER_NAME"] 来自己处理 URL 的话,那么在 nginx + php 的默认环境下,它获得的将始终是 server_name 设置中的第一个域名,所以造成了“不管通过什么域名访问 MediaWiki 首页,都会被跳转到其中的一个域名上。”,这不是 nginx 的重定向造成的,虽然默认 server_name_in_redirect 是 on,但这个指令的影响范围仅仅只是 nginx 自己内部的重定向规则。
有不少TX可能因为一些原因(比如说天朝的cn域名不停政策变化等)从cn域名转换到了其他域名,但是原来使用的cn域名可能已经积攒了大量的搜索引擎亲和因子,在各大搜索引擎被收录了上万的页面,冒然的直接启用新域名会显得得不偿失。所以这个时候通过一些方法最大可能地保存原来已经有的一些网页资源是势在必行的事情。
对于Google来说可以通过Google提供的网站管理员工具来加快域名转移的速度和效果,关于Google网站管理员工具的操作这里就不赘述了,相关的介绍非常详细。
在执行完前期的网站程序和数据转移之后就需要对原网站进行301的永久重定向,在Apache 下可以通过.htaccess配置RewriteRule,Nginx则在配置文件中加上跟下面类似的一段配置就行:
- server {
- listen 80;
- server_name holmesian.cn www.holmesian.cn;
- if ($http_host !~ ~S^holmesian\.org$~T) {
- rewrite ^(.*) http://holmesian.org$1 permanent;
- }
- }
这里值得一提的是Nginx的 Rewrite Flags:
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301
测试一下,现在从搜索引擎来的holmesian.cn和www.holmesian.cn都被直接转成holmesian.org,用户几乎没有任何察觉。接下来等待搜索引擎响应了……估计这个会有一个周期。
终于解决FreeBSD下Nginx做前端 FastCGI的PHP出现问题的情况了,原因很囧
过程如下:
ecjtu# whereis php-cgi
php-cgi: /usr/local/bin/php-cgi
ecjtu# spawn-fcgi -a 127.0.0.1 -p 139 -C 64 -f /usr/local/php/bin/php-cgi
spawn-fcgi: child exited with: 127
ecjtu# spawn-fcgi -a 127.0.0.1 -p 139 -C 64 -u www -f /usr/local/bin/php-cgi
spawn-fcgi: child exited with: 13
ecjtu# spawn-fcgi -a 127.0.0.1 -p 139 -C 64 -U www -f /usr/local/bin/php-cgi
spawn-fcgi: child spawned successfully: PID: 39766
现在OK了
莫非127错误是php-cgi位置错误 13错误是大写U写成了小写u
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;



