用Nginx优化静态网址,将URL后缀统一替换成斜杠

Redirect to Url with Slash Suffix Using Nginx

URL是一个网页的门面,网站建站时,就需要认真地对网站的内容和结构进行规划,而URL的格式最能直接地体现网站是否有合理的结构,便于用户和搜索引擎了解网站内容。其中,URL可以分为动态、静态、伪静态三种类型,本文我们主要讨论如何用Nginx来对静态URL进行优化,使整个网站具有统一、清晰的URL格式。

静态URL的几种格式

针对同一个网页,我们可能会为其设置不同格式的URL。假设我们在网站的 a 目录下有一个页面 b,那么这个网页常见的几种URL格式如下:

  1. http://www.sample.com/a/b
  2. http://www.sample.com/a/b.html
  3. http://www.sample.com/a/b/

由于静态URL通常与服务器硬盘上的文件直接对应,因此上面几种格式的URL就分别代表了几种不同的情况:

  1. /a/b 这种格式,服务器会先到 a 文件夹下寻找 b 文件,如果找到了 b 文件,那么就直接返回给前端。否则,如果 a 文件夹下存在一个名为 b 的文件夹,那么服务器就会找到 b 文件夹内的默认页面文件,通常是 index.html,然后返回给前端。
  2. /a/b.html 这种格式,本质上和第一种情况相同,服务器会先查找 a 文件夹下的 b.html 文件,没找到的话就会查找 b.html 文件夹下的默认页面文件(b.html 也可以是文件夹的名称)。
  3. /a/b/ 这种格式与上面两种情况不同,由于URL末尾带斜杠 /,那么服务器就知道 b 是一个目录,会直接查找 b 文件夹下的默认页面文件。

URL末尾要不要带斜杠

通常我们在服务器硬盘上的文件都会带一个文件后缀名,例如 .html 或者 .htm,而文件夹通常不带后缀。因此,上面第一种格式的URL在大多数情况下访问的还是 b 文件夹下的默认页面文件,就与第三种格式情况相同,但是服务器需要查找两次才能找到对应的文件。所以带斜杠会略快于不带斜杠的URL。

对于URL末尾到底要不要带斜杠,从SEO的角度来说,两者也有所区别。末尾不带斜杠的URL会被看做是一个文件,带斜杠的会被看作是一个目录,而搜索引擎更倾向于去探索一个目录下是否还包括更多的网页,因此在收录时就会偏向末尾带斜杠的URL。

同一个页面被重复收录的问题

经过前面的对比,我们知道了下面三种URL在大多数情况下都是访问的同一个网页:

  1. /a/b
  2. /a/b/
  3. /a/b/index.html

那么这个时候就会产生搜索引擎对同一个页面重复收录的问题。如果搜索引擎同时收录了其中的两个甚至三个URL,那么就会被判定为重复内容,降低对网站的评级,对网站SEO产生很大的影响。

为了解决这个问题,我们就需要确定一个统一格式的URL,并将另外两种格式的URL永久重定向到我们选定的URL上。经过前面的对比,格式2更加简洁、清晰,同时还有利于SEO。那么接下来,我们就介绍一下如何用Nginx将网站的URL格式统一成末尾带斜杠的格式。

用Nginx将 /a/b 重定向到 /a/b/

用Nginx给URL末尾添加斜杠其实很简单,Nginx自身的逻辑和配置就已经支持这种重定向,只需要简单配置一个路径映射即可:

location / { root "<网站页面在服务器上所处的目录>"; index index.html; }

配置好以后只需要注意一个问题,以 /a/b/ 为例,a 文件夹下必须有一个 b 文件夹,不能有名称为 b 的文件,同时 b 文件夹下必须有一个默认页面文件(在上面的代码中是 index.html)。

用Nginx将 /a/b/index.html 重定向到 /a/b/

针对这种情况,只需要在路径映射中将请求URL路径末尾的 /index.html 替换成 / 即可,我们用正则匹配来查找并完成替换:

location / { if ($request_uri ~ ^(.*)/index.html(\?.*)?$) { return 301 $1/$2; } root "<网站页面在服务器上所处的目录>"; index index.html; }

上面配置代码中,第2行判断请求URL是否能够匹配正则表达式 ^(.*)/index.html(\?.*)?$,即判断请求路径末尾(以及请求参数之前)是否是 /index.html,如果匹配成功,那么就在第3行将 /index.html 替换成 /,然后返回301永久重定向。

总结

通过上面的Nginx配置,我们就可以将网站的静态URL统一成末尾带斜杠的格式,将页面的流量集中到一个URL上,同时也有利于SEO。最后,在发网站外链时最好也都使用这种统一的格式,保持网站链接一致性。

文章评论
${fromAuthor ? '郄正元' : '游客'} 作者 ${gmtCreate}
${content}
${subList.length}
发表评论
${commentToArticle ? '' : parentContent}
字数:0/${maxCommentLength}
该邮箱地址仅用于接收其他用户的回复提醒,不会泄露