Nginx no-www 到 www 以及 www 到 no-www
我正在 Rackspace 云上使用 nginx教程并在网上进行了搜索,但到目前为止还无法对此进行排序。
出于 SEO 和其他原因,我希望 www.mysite.example
在 .htaccess 中正常访问 mysite.example
。
我的 /etc/nginx/sites-available/www.example.com.vhost 配置:
server {
listen 80;
server_name www.example.com example.com;
root /var/www/www.example.com/web;
if ($http_host != "www.example.com") {
rewrite ^ http://example.com$request_uri permanent;
}
我也尝试过
server {
listen 80;
server_name example.com;
root /var/www/www.example.com/web;
if ($http_host != "www.example.com") {
rewrite ^ http://example.com$request_uri permanent;
}
我也尝试过。第二次尝试都给出了重定向循环错误。
if ($host = 'www.example.com' ) {
rewrite ^ http://example.com$uri permanent;
}
我的 DNS 设置为标准:(
site.example 192.192.6.8 A type at 300 seconds
www.site.example 192.192.6.8 A type at 300 seconds
示例 IP 和文件夹已用作示例并为将来的人们提供帮助)。我使用Ubuntu 11。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(20)
HTTP 解决方案
从 文档 中,“正确的方法是定义一个单独的服务器
example.org
”:HTTPS 解决方案
对于那些想要包含
https://
的解决方案的人...注意:我最初并未包含
https://< /code> 在我的解决方案中,因为我们使用负载均衡器并且我们的 https:// 服务器是高流量 SSL 支付服务器:我们不会混合使用 https:// 和 http://。
要检查 Nginx 版本,请使用 nginx -v 。
使用 Nginx 重定向从 URL 中去除 www
所以你需要有两个服务器代码。
使用 Nginx 重定向将 www 添加到 URL
如果您需要相反,则从
domain.example
重定向到www.domain.example
,您可以使用这个:正如您可以想象的,这正好相反,并且与第一个示例的工作方式相同。这样,您就不会降低 SEO 标记,因为它是完整的永久重定向和移动。强制无 WWW 并显示目录!
下面显示了我的一些代码,以便更好地查看:
HTTP Solution
From the documentation, "the right way is to define a separate server for
example.org
":HTTPS Solution
For those who want a solution including
https://
...Note: I have not originally included
https://
in my solution since we use loadbalancers and our https:// server is a high-traffic SSL payment server: we do not mix https:// and http://.To check the Nginx version, use
nginx -v
.Strip www from URL with Nginx redirect
So you need to have TWO server codes.
Add the www to the URL with Nginx redirect
If what you need is the opposite, to redirect from
domain.example
towww.domain.example
, you can use this:As you can imagine, this is just the opposite and works the same way the first example. This way, you don't get SEO marks down, as it is complete perm redirect and move. The no WWW is forced and the directory shown!
Some of my code shown below for a better view:
实际上你甚至不需要重写。
因为我的答案得到了越来越多的支持,但上述情况也是如此。您永远不应该在这种情况下使用
重写
。为什么?因为nginx要处理并开始搜索。如果您使用return
(在任何 nginx 版本中都应该可用),它会直接停止执行。这在任何情况下都是首选。将非 SSL 和 SSL 重定向到非 www 对应项:
如果您的服务器仅侦听端口 80(默认),则
$scheme
变量将仅包含http
监听选项不包含ssl
关键字。不使用该变量不会获得任何性能。请注意,如果使用 HSTS,则需要更多服务器块,因为 HSTS 标头不应通过非加密连接发送。因此,您需要具有重定向的未加密服务器块和具有重定向和 HSTS 标头的加密服务器块。
将所有内容重定向到 SSL(UNIX 上使用 IPv4、IPv6、SPDY 等的个人配置):
我想您现在可以自己想象具有此模式的其他组合。
更多我的配置?转到此处和
Actually you don't even need a rewrite.
As my answer is getting more and more up votes but the above as well. You should never use a
rewrite
in this context. Why? Because nginx has to process and start a search. If you usereturn
(which should be available in any nginx version) it directly stops execution. This is preferred in any context.Redirect both, non-SSL and SSL to their non-www counterpart:
The
$scheme
variable will only containhttp
if your server is only listening on port 80 (default) and the listen option does not contain thessl
keyword. Not using the variable will not gain you any performance.Note that you need even more server blocks if you use HSTS, because the HSTS headers should not be sent over non-encrypted connections. Hence, you need unencrypted server blocks with redirects and encrypted server blocks with redirects and HSTS headers.
Redirect everything to SSL (personal config on UNIX with IPv4, IPv6, SPDY, ...):
I guess you can imagine other compounds with this pattern now by yourself.
More of my configs? Go here and here.
最佳实践:使用硬编码的
server_name
单独的服务器
nginx 的最佳实践是使用单独的
server
进行这样的重定向(不与主要配置的server
),对所有内容进行硬编码,并且根本不使用正则表达式。如果您使用 HTTPS,可能还需要对域进行硬编码,因为您必须预先知道要提供哪些证书。
在
server_name
中使用正则表达式如果您有多个站点,并且不关心最高的性能,但希望每个站点在
方面都具有相同的策略www.
前缀,那么就可以使用正则表达式了。使用单独的服务器
的最佳实践仍然有效。请注意,如果您使用 https,此解决方案会变得很棘手,因为如果您希望此解决方案正常工作,您必须拥有一个证书来覆盖您的所有域名。
非
www
到www
,在所有站点的专用单个服务器
中使用正则表达式:www
到非< code>www w/ 正则表达式位于所有站点的专用单个server
中:www
到非www
w/ 正则表达式仅适用于某些网站的专用服务器
:可能需要限制正则表达式仅覆盖几个域,那么您可以使用类似的内容来仅匹配
www.example.org
、www.example.com
和www .subdomain.example.net
:使用 nginx 测试正则表达式
您可以使用 测试正则表达式是否按预期工作
pcretest
在您的系统上,它与您的 nginx 完全相同pcre
库用于正则表达式:请注意,您不必担心尾随点或大小写,因为 nginx 已经处理了它,按照 当“Host”标头有尾随时,nginx 服务器名称正则表达式点。
在现有
服务器
/HTTPS中撒入if
:这个最终解决方案通常不被认为是最佳实践,但是,它仍然有效并完成了工作。
事实上,如果您使用 HTTPS,那么最终的解决方案可能会更容易维护,因为您不必在不同的
server
定义之间复制粘贴一大堆 ssl 指令,并且可以仅将片段放入所需的服务器中,从而更轻松地调试和维护站点。非
www
到www
:www
到非www
:硬编码单个首选域
如果你想要一点为了提高性能,以及单个
服务器
可能使用的多个域之间的一致性,显式硬编码单个首选域可能仍然有意义:参考:
Best Practice: separate
server
w/ hardcodedserver_name
Best practice with nginx is to use a separate
server
for a redirect like this (not shared with theserver
of your main configuration), to hardcode everything, and not use regular expressions at all.It may also be necessary to hardcode the domains if you're using HTTPS, because you have to know upfront which certificates you'll be providing.
Using Regular Expressions within
server_name
If you have a number of sites, and don't care for the most ultimate performance, but want every single one of them to have the same policy in regards to the
www.
prefix, then you can use regular expressions. The best practice of using a separateserver
would still stand.Note that this solution gets tricky if you use https, as you must then have a single certificate to cover all of your domain names if you want this to work properly.
non-
www
towww
w/ regex in a dedicated singleserver
for all sites:www
to non-www
w/ regex in a dedicated singleserver
for all sites:www
to non-www
w/ regex in a dedicatedserver
for some sites only:It may be necessary to restrict the regex to cover only a couple of domains, then you can use something like this to only match
www.example.org
,www.example.com
andwww.subdomain.example.net
:Testing Regular Expressions w/ nginx
You can test that the regex works as expected with
pcretest
on your system, which is the exact samepcre
library that your nginx will be using for regular expressions:Note that you don't have to worry about trailing dots or case, as nginx already takes care of it, as per nginx server name regex when "Host" header has a trailing dot.
Sprinkle
if
within existingserver
/ HTTPS:This final solution is generally not considered to be the best practice, however, it still works and does the job.
In fact, if you're using HTTPS, then this final solution may end up easier to maintain, as you wouldn't have to copy-paste a whole bunch of ssl directives between the different
server
definitions, and could instead place the snippets only into the needed servers, making it easier to debug and maintain your sites.non-
www
towww
:www
to non-www
:hardcoding a single preferred domain
If you want a little bit more performance, as well as consistency between multiple domains a single
server
may use, it might still make sense to explicitly hardcode a single preferred domain:References:
您可能会发现您想要对更多域使用相同的配置。
以下代码片段删除任何域之前的 www:
You may find out you want to use the same config for more domains.
Following snippet removes www before any domain:
您需要两个服务器块。
将这些放入您的配置文件中,例如
/etc/nginx/sites-available/sitename
假设您决定将
http://example.com
作为要使用的主要地址。您的配置文件应如下所示:
第一个服务器块将包含重定向任何带有“www”前缀的请求的指令。它侦听对带有“www”前缀的 URL 的请求并进行重定向。
它没有任何其他作用。
第二个服务器块将保存您的主要地址 - 您要使用的 URL。所有其他设置都位于此处,例如
root
、index
、location
等。检查默认文件以了解可以包含在服务器块中的其他设置。服务器需要两条 DNS A 记录。
对于 ipv6,使用 your-ipv6-address 创建一对 AAAA 记录。
You need two server blocks.
Put these into your config file eg
/etc/nginx/sites-available/sitename
Let's say you decide to have
http://example.com
as the main address to use.Your config file should look like this:
The first server block will hold the instructions to redirect any requests with the 'www' prefix. It listens to requests for the URL with 'www' prefix and redirects.
It does nothing else.
The second server block will hold your main address — the URL you want to use. All other settings go here like
root
,index
,location
, etc. Check the default file for these other settings you can include in the server block.The server needs two DNS A records.
For ipv6 create the pair of AAAA records using your-ipv6-address.
以下是如何对多个 www 到无 www 服务器名称执行此操作(我将其用于子域):
Here's how to do it for multiple www to no-www server names (I used this for subdomains):
我结合了所有简单答案中最好的,没有硬编码域。
从非www到www(HTTP或HTTPS)的301永久重定向:
如果您更喜欢非HTTPS、非www到HTTPS、www同时重定向:
I combined the best of all the simple answers, without hard-coded domains.
301 permanent redirect from non-www to www (HTTP or HTTPS):
If you prefer non-HTTPS, non-www to HTTPS, www redirect at the same time:
这个解决方案来自我的个人经验。我们使用多个 Amazon S3 存储桶和一台服务器将
非 www
重定向到www
域名以匹配 S3“主机”标头策略。我对 nginx 服务器使用了以下配置:
这匹配指向服务器的所有域名,以
www.
开头,并重定向到www. 。
。以同样的方式,您可以执行从www
到non-www
的相反重定向。This solution comes from my personal experience. We used several Amazon S3 buckets and one server for redirecting
non-www
towww
domain names to match S3 "Host" header policy.I used the following configuration for nginx server:
This matches all domain names pointed to the server starting with whatever but
www.
and redirects towww.<domain>
. In the same manner you can do opposite redirect fromwww
tonon-www
.试试这个
其他方式:
Nginx no-www 到 www
以及 www 到 no-www
try this
Other way:
Nginx no-www to www
and www to no-www
将非 www 重定向到 www
对于单个域:
对于所有域:
将 www 重定向到非 www
对于单个域:
对于所有域:
Redirect non-www to www
For Single Domain :
For All Domains :
Redirect www to non-www
For Single Domain:
For All Domains :
独特的格式:
Unique format:
如果您不想对域名进行硬编码,可以使用此重定向块。不带前导 www 的域将保存为变量
$domain
,可以在重定向语句中重用。REF: 在 nginx 中使用正则表达式重定向子域
If you don't want to hardcode the domain name, you can use this redirect block. The domain without the leading www is saved as variable
$domain
which can be reused in the redirect statement.REF: Redirecting a subdomain with a regular expression in nginx
不确定是否有人注意到返回 301 可能是正确的,但浏览器对此感到窒息,
因为它的速度比:
not sure if anyone notice it may be correct to return a 301 but browsers choke on it to doing
is faster than:
Ghost 博客
为了让 nginx 推荐使用
return 301 $scheme://example.com$request_uri;
与 Ghost 一起使用的方法,您需要在主服务器块中添加:Ghost blog
in order to make nginx recommended method with
return 301 $scheme://example.com$request_uri;
work with Ghost you will need to add in your main server block:我的配置是 - Nginx + tomcat 9 + Ubuntu 20.04 + spring boot 应用程序
上面的所有答案都不适合我 - 也不适用于 Nginx 文件中的上游符号 - 所以我更改了我的设置,
感谢上帝的 certbot - 这个实用程序非常有用,它为您的网站生成基本文件,然后我添加了我的更改 - 重定向
https://www.example.com
、http://www.example.com
仅限一个https://example.com
my configuration was - Nginx + tomcat 9 + Ubuntu 20.04 + spring boot app
all answers above not working for me - also not work upstream notation in Nginx file - so I change my settings on this
thanks God for certbot - this util very helpful, it's generate base file for your site and then I added my changes - to redirect
https://www.example.com
,http://www.example.com
to only onehttps://example.com
使用 cloudflare 添加 CNAME 并使用此格式作为 conf 文件。
Add CNAME with cloudflare and use this format as conf file.
关键是根据您的情况将所有两个或三个服务器块分开,例如,如果使用 SSL,则应该有 3 个服务器块:
第 1 块:处理 www 到非 www 重定向:
第 2 块:从域根提供文件的主块:
第 3 块:从 http 到 https 的可选 SSL 重定向处理:
我也遇到了麻烦,但最终想通了 从 WWW 重定向到NGINX 中的非 WWW。建议通过链接进行逐步说明。如果您有任何疑问,请告诉我。
Key is to separate all two or three server blocks depending upon your situation for example if using SSL there should be 3 server blocks:
Block 1: To handle www to non-www redirect:
Block 2: Main block to serve files from domain root:
Block 3: Optional SSL redirection handling from http to https:
I was also having a trouble but finally figured out Redirection from WWW to NON-WWW in NGINX. Recommended to go through link as it explains step-by-step. Let me know if you have any questions.
如果您无法正常工作,您可能需要添加服务器的 IP 地址。例如:
其中 XXX.XXX.XXX.XXX 是 IP 地址(显然)。
注意:必须定义 ssl crt 和密钥位置才能正确重定向 https 请求
进行更改后不要忘记重新启动 nginx:
If you are having trouble getting this working, you may need to add the IP address of your server. For example:
where XXX.XXX.XXX.XXX is the IP address (obviously).
Note: ssl crt and key location must be defined to properly redirect https requests
Don't forget to restart nginx after making the changes: