首先解释下关于301和302的区别:

1、什么是301重定向?
  301转向(或叫301重定向,301跳转)是当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header)中的状态码的一种,表示本网页永久性转移到另一个地址。
2、什么是302重定向?
  302重定向又称之为302代表暂时性转移(Temporarily Moved ),英文名称:302 redirect。 也被认为是暂时重定向(temporary redirect),一条对网站浏览器的指令来显示浏览器被要求显示的不同的URL,当一个网页经历过短期的URL的变化时使用。一个暂时重定向是一种服 务器端的重定向,能够被搜索引擎蜘蛛正确地处理。
3、301重定向与302重定向的区别
  302重定向是暂时的重定向,搜索引擎会抓取新的内容而保留旧的网址。因为服务器返回302代码,搜索引擎认为新的网址只是暂时的。 SEO 302好于301
  301重定向是永久的重定向,搜索引擎在抓取新内容的同时也将旧的网址替换为重定向之后的网址。

需求是这样的:

1、非www.abc.com域名访问,返回403,防止恶意解析。

即使别人的域名绑定到你的主机的IP上,也无法访问你的站点,如果有用户通过访问他的域名,用户的浏览器会返回403错误,而不是跳出你的网站。

2、当abc.com域名访问时,自动301重写为www.abc.com,增加SEO权重...

增加域名权重
对网页收录的优化
有利于网页PR传递
可促进搜索引擎优化效果 
对用户体验表示友好

3、以上两个需求共存。


1、非www.abc.com域名访问,返回403,防止恶意解析。

server {
        listen       80;
        server_name  abc.com   www.abc.com;
		if ( $host != 'www.abc.com' ){  
        return 403; 
        }

2、当abc.com域名访问时,自动301重写为www.abc.com。

server {
        listen       80;
        server_name  abc.com   www.abc.com;
		if ( $host = 'abc.com' ){  		
        rewrite ^/(.*)$ http://www.abc.com/$1 permanent;
        }

3、非www.abc.com域名访问,返回403错误,当abc.com域名访问时,自动301重写为www.abc.com。

server {
        listen       80;
        server_name  abc.com www.abc.com;
		
		if ( $host = 'abc.com' ){  
        rewrite ^/(.*)$ http://www.abc.com/$1 permanent;
      }
	  
		if ( $host != 'www.abc.com' ){  
        return 403;
      }