<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[Nginx虚拟主机多server_name（多域名）的顺序问题]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Wed, 16 Mar 2011 14:37:42 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	在一个Nginx虚拟主机中，可以绑定多个server_name，例如：<br/><div class="code"><br/>&nbsp;&nbsp;server<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;listen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 80;<br/>&nbsp;&nbsp;&nbsp;&nbsp;server_name&nbsp;&nbsp;jackxiang.com www.jackxiang.com blog.jackxiang.com;<br/></div><br/>而server_name的先后顺序的不同，对PHP程序中使用$_SERVER[&quot;SERVER_NAME&quot;]或getenv(&#039;SERVER_NAME&#039;)获取服务器域名是有影响的：<br/>访问：jackxiang.com 是：jackxiang.com<br/>访问：www.jackxiang.com 是：jackxiang.com<br/>访问：blog.jackxiang.com 还是：jackxiang.com<br/>Nginx下的PHP获取的使终是第一个域名！！！<br/><br/><br/>$_SERVER[&quot;SERVER_NAME&quot;]或getenv(&#039;SERVER_NAME&#039;)获取的始终将是Nginx server_name配置中的第一个域名，这一点在程序开发中需要注意。这第一个域名就相当于Apache虚拟主机配置中的ServerName，后面的域名就相当于Apache的ServerAlias<br/>PS：以下是网友Daze的留言，希望对本文读者有所帮助。<br/>在某些情况下（具体可参考 wiki.nginx.org），Nginx 内部重定向规则会被启动，例如，当 URL 指向一个目录并且在最后没有包含“/”时，Nginx 内部会自动的做一个 301 重定向，这时会有两种情况：<br/>1、server_name_in_redirect on（默认），URL 重定向为： server_name 中的第一个域名 + 目录名 + /；<br/>2、server_name_in_redirect off，URL 重定向为： 原 URL 中的域名 + 目录名 + /。<br/><br/>当你有多个域名要指向同一个虚拟主机，并且你自己写 301 重定向规则把它们合并到某一个域名时，情况就更复杂了：<br/>首先，nginx 检查 URL，如果符合条件，就用该规则（你写的）做第一遍重定向，接着，检查新生成的 URL，如果符合内部自动重定向之条件，就用前面提到的规则再做一次重定向。<br/><br/>至于 PHP 的 $_SERVER[&quot;SERVER_NAME&quot;]，在 nginx 中默认是由 nginx 的变量 $server_name 提供，这时它和重定向没有关系，始终是 server_name 设置中的第一个域名，但这是可以被改变的，在你的 nginx 配置中找到 fastcgi_param 部分，修改<br/>fastcgi_param&nbsp;&nbsp;SERVER_NAME&nbsp;&nbsp;&nbsp;&nbsp;$server_name;<br/>为<br/>fastcgi_param&nbsp;&nbsp;SERVER_NAME&nbsp;&nbsp;&nbsp;&nbsp;$host;<br/>但现在就要注意了，此时的 $_SERVER[&quot;SERVER_NAME&quot;] 会受你写的和 nginx 自己的重定向规则所影响而变化。<br/><br/>现在就清楚了，如果 MediaWiki 是通过 $_SERVER[&quot;SERVER_NAME&quot;] 来自己处理 URL 的话，那么在 nginx + php 的默认环境下，它获得的将始终是 server_name 设置中的第一个域名，所以造成了“不管通过什么域名访问 MediaWiki 首页，都会被跳转到其中的一个域名上。”，这不是 nginx 的重定向造成的，虽然默认 server_name_in_redirect 是 on，但这个指令的影响范围仅仅只是 nginx 自己内部的重定向规则，所以，当你在 nginx + php 的环境中使用多域名虚拟主机，并且你的 php 库、框架、代码大量使用 $_SERVER[&quot;SERVER_NAME&quot;] 时，你也许应该：<br/>1、设置 fastcgi_param&nbsp;&nbsp;SERVER_NAME&nbsp;&nbsp;&nbsp;&nbsp;$host;<br/>2、设置 server_name_in_redirect off; 让 nginx 在处理自己内部重定向时不默认使用&nbsp;&nbsp;server_name 设置中的第一个域名；<br/>3、不要使用 nginx 的 rewrite 规则来重定向、合并多个域名。<br/>当然，后俩条是完全可选的，前提是你清楚你在做什么并且小心处理这时的&nbsp;&nbsp;$_SERVER[&quot;SERVER_NAME&quot;]，也许更好的做法是保持 fastcgi_param&nbsp;&nbsp;SERVER_NAME&nbsp;&nbsp;&nbsp;&nbsp;$server_name; ，然后合理使用 $_SERVER[&quot;SERVER_NAME&quot;] 和 $_SERVER[&quot;HTTP_HOST&quot;]。<br/><br/>这个问题确实很微妙，也许我的理解还是不完全，好在还有 curl ，慢慢研究了。 :-)<br/><br/>P.S. nginx 0.7.x 之前的版本还有一个指令 optimize_server_names 会影响内部重定向规则。<br/><br/>来源：http://blog.s135.com/post/382/
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] Nginx虚拟主机多server_name（多域名）的顺序问题]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>