记一次nginx重定向操作

引言

今天有一个朋友,需要配置一个301重定向,需求是要把xxx.com下所有的请求全部重定向到www.xxx.com 下来.同时xxx.com后面所有的参数全部都要去掉,感觉是非常奇怪的请求,朋友操作很久之后未果,于是就让我帮忙看看,这里是一个非常简单的操作,但是仍然踩了一些坑,于是准备记录一下,避免自己在未来或者其他的人踩坑

配置

首先配置非常简单,这里是nginx服务器,所以只要配置一个rewrite就可以了,配置代码如下(仅显示相关配置代码)


server_name xxx.com www.xxx.com; ........ if ( $host != 'www.xxx.com' ){ rewrite ^.*$ http://www.xxx.com/ permanent; break; }

这里的配置需要注意的是,我在重定向的域名后面加上了/符号,如果不加这个符号,那么像xxx.com/somesting 这样的请求会重定向到http://www.xxx.com/somestring ,也就是说这里会自动的把后面的目录和参数加到重定向域名的后面,就相当于这样的配置

if ( $host != 'www.xxx.com' ){
    rewrite  ^/(.*)$  http://www.xxx.com/$1   permanent;
    break;
}

这里应该是是nginx的一个特性,加上/符号之后就不会有了

遇到的问题

一开始我告诉朋友这个配置的时候,并没有效果,于是我觉得很奇怪,因为在我的印象中,这个配置不可能有问题的,ping一下域名,发现对方有一个隐性url解析,解析是@主机记录,解析的位置是www.xxx.com , 于是这里就非常有意思了,ping www.xxx.com 这个域名的时候,是正确的服务器ip地址,但是ping xxx.com的时候,这个地址就是一个其他无关的地址,所以导致解析没有办法生效.
这里我想说的是,在配置web服务器的时候,域名解析和web服务器配置是相关联的,在一次http请求过程中,首先是查询dns找到域名的主机位置,然后才会把请求转发给服务器,交给服务器接管,这里和操作系统的启动有点类似,bios加载了引导之后才会把控制权交给操作系统.

尾语

这一次经历虽然短暂,但是让我对一个信念认识的更加深刻了 ,条条大路通罗马 , 实现一个重定向配置,不仅仅是可以通过web服务器来解决的,这里就至少有三个解决方案了,首先是通过域名解析的时候,对域名进行隐性的解析能够生效,其次就是配置web服务器了,再者其实可以使用php代码来对请求做处理,多种多样的手法,于是我们怎么配置怎么来了.
不过要说功能更全面的话,还是要了解web服务器最好,比如这里的特殊需求,要xxx.com/somestring 在重定向之后删除后面所有的多余字符串,虽然我不明白这么做的用意是什么,但是这个需求web服务器搞定是没有问题的.
最后坚定一下信仰,nginx作为一个轻量级的服务器其实真的不仅仅是清量那么简单,真的是功能非常齐全的.

发表评论