220

如何重定向mydomain.example(我的域名示例)和任何子域*.mydomain.example(.mydomain示例)www.adifferencedomain.example使用Nginx?

8个答案8

重置为默认值
385

服务器名称使用支持后缀匹配.mydomain.example(.mydomain示例)语法:

服务器{服务器名称.mydomain.example;重写^http://www.adifferencedomain.example$request_uri?永久的;}

或在0.9.1或更高版本上:

服务器{服务器名称.mydomain.example;返回301http://www.adifferencedomain.example$request_uri;}
14
  • 1
    我不需要插入端口来监听吗?例如,听80。我有多个域需要重定向到主域,但我的服务器也有多个虚拟服务器用于各种其他域。
    – 赖安
    评论 2013年1月25日22:26
  • 2
    @瑞安·The未指定时,指令默认为端口80。实际上,这比一般情况要复杂一些;请参阅nginx配置文档了解更多详细信息。
    – 伊茨
    评论 2013年9月23日17:17
  • 什么是?最终实现? 评论 2014年7月4日0:26
  • 7
    两者的区别是什么重写返回301$方案://www.adiofferentdomain.com$request_uri;? 评论 2014年7月4日0:27
  • 7
    这个?重写结束时,告诉nginx不要附加原始查询字符串。因为$request_uri已经有了查询字符串,无需再次追加。这个返回301语法更新了,这两种方法在行为上应该没有区别,但当我最初回答这个问题时,许多发行版没有所需的版本,所以我选择了更安全的语法。 评论 2014年7月23日11:49
35
服务器{服务器名称.mydomain.example;返回301http://www.adifferencedomain.example$request_uri;}

http://wiki.nginx.org/HttpRewriteModule#return

http://wiki.nginx.org/陷阱#Taxing_Rewrites

0
23

我在我的网站上使用此代码

服务器{听80;听443;服务器名.domain.example;返回301$模式://newdomain.example$request_uri;}
4
  • 1
    这是迄今为止最准确的答案。$方案可能有点争议,但另一方面,它涵盖了本地开发/专用网络案例。 评论 2022年3月12日11:17
  • 1
    这是最好的答案! 评论 2022年11月30日9:04
  • 浏览器会抱怨443没有可用的SSL证书吗? 评论 4月23日12:24
  • 如果你有合适的证书,它就不会。
    – 技术
    评论 4月29日5:13
21

如果可以,为什么要使用重写模块返回? 从技术上讲,返回作为重写模块的一部分你可以在这里阅读但这个片段更容易阅读imho。

服务器{服务器名.domain.com;返回302$scheme://forwarded-domain.com;}

你也可以给它一个301重定向。

4
  • 1
    这会保留路径和查询参数吗? 评论 2014年12月30日21:56
  • 4
    不,这个例子没有做到这一点,@Mark。但我想你可以把前面的答案混合起来,得出这样的结果:返回302$scheme://forwarded-domain.com$request_uri; 评论 2015年1月5日15:12
  • 顺便提一下,在许多情况下,您可能只需要重定向到https,而不是保留方案(即使用https而不是$scheme)。这与协议相关链接现在被视为已弃用的原因相同-paulirish.com/2010/the-protocol-relative-url 评论 2015年4月29日8:36
  • @mahemoff这并不完全正确。考虑一下这样的情况:Web服务器位于释放ssl的负载平衡器后面。 评论 2016年9月22日8:13
13

这应该通过HTTP重写模块.

示例重写自www.example.com网站到example.com:

服务器{服务器名称www.example.com;重写^http://example.com$request_uri?永久的;}
5
  • 这只是将www.example.com重定向到example.com.我想将两者重定向到不同的域。我能用一条规则做到这一点吗?
    – 黛布
    评论 2011年5月18日13:12
  • 我不确定,但我认为server_name mydomain.com;重写www.adifferencedomain.com permanent;}应该这么做吗?这应该会占据一切*.mydomain.com?
    – 乌多
    评论 2011年5月18日13:25
  • @黛布,你就可以了服务器名称example.com www.example.com;.
    – 柑橘皮
    评论 2012年8月22日16:15
  • 这个问题特别要求任何子域重定向到不同的域。这个答案(明确地)不回答这两个问题。
    – 基萨基
    评论 2014年9月25日8:27
  • 这错过了重要的301! 评论 2019年5月2日11:39
11

如果您想重定向的请求域1.示例domain2.示例,可以创建如下所示的服务器块:

服务器{听80;服务器名称域1.示例;返回301$scheme://domain2.示例$request_uri;}
2
  • 有人可能还需要重定向https://请求。听443; 评论 2020年2月24日16:33
  • 1
    @拉菲克·法哈德监听443 ssl; 评论 2021年12月23日15:29
7

您只需在服务器{}块中编写一个if条件:

服务器{if($host=mydomain.example){返回301http://www.adidifferentdomain.example(网址:http://www.adifferentdomain.example);}}
2
4

临时重定向

重写^http://www.RedirectToThisDomain.example(重定向到此域示例)$request_uri?重定向;

永久重定向

重写^http://www.RedirectToThisDomain.example(重定向到此域)$request_uri?永久的;

在特定站点的Nginx配置文件中:

服务器{服务器名称www.example.com;重写^http://www.RedictToThisDomain.example(重定向到此域示例)$request_uri?重定向;}

您的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.