用Nginx优化静态网址,将URL后缀统一替换成斜杠
URL是一个网页的门面,网站建站时,就需要认真地对网站的内容和结构进行规划,而URL的格式最能直接地体现网站是否有合理的结构,便于用户和搜索引擎了解网站内容。其中,URL可以分为动态、静态、伪静态三种类型,本文我们主要讨论如何用Nginx来对静态URL进行优化,使整个网站具有统一、清晰的URL格式。
静态URL的几种格式
针对同一个网页,我们可能会为其设置不同格式的URL。假设我们在网站的 a
目录下有一个页面 b
,那么这个网页常见的几种URL格式如下:
http://www.sample.com/a/b
http://www.sample.com/a/b.html
http://www.sample.com/a/b/
由于静态URL通常与服务器硬盘上的文件直接对应,因此上面几种格式的URL就分别代表了几种不同的情况:
/a/b
这种格式,服务器会先到a
文件夹下寻找b
文件,如果找到了b
文件,那么就直接返回给前端。否则,如果a
文件夹下存在一个名为b
的文件夹,那么服务器就会找到b
文件夹内的默认页面文件,通常是index.html
,然后返回给前端。/a/b.html
这种格式,本质上和第一种情况相同,服务器会先查找a
文件夹下的b.html
文件,没找到的话就会查找b.html
文件夹下的默认页面文件(b.html
也可以是文件夹的名称)。/a/b/
这种格式与上面两种情况不同,由于URL末尾带斜杠/
,那么服务器就知道b
是一个目录,会直接查找b
文件夹下的默认页面文件。
URL末尾要不要带斜杠
通常我们在服务器硬盘上的文件都会带一个文件后缀名,例如 .html
或者 .htm
,而文件夹通常不带后缀。因此,上面第一种格式的URL在大多数情况下访问的还是 b
文件夹下的默认页面文件,就与第三种格式情况相同,但是服务器需要查找两次才能找到对应的文件。所以带斜杠会略快于不带斜杠的URL。
对于URL末尾到底要不要带斜杠,从SEO的角度来说,两者也有所区别。末尾不带斜杠的URL会被看做是一个文件,带斜杠的会被看作是一个目录,而搜索引擎更倾向于去探索一个目录下是否还包括更多的网页,因此在收录时就会偏向末尾带斜杠的URL。
同一个页面被重复收录的问题
经过前面的对比,我们知道了下面三种URL在大多数情况下都是访问的同一个网页:
/a/b
/a/b/
/a/b/index.html
那么这个时候就会产生搜索引擎对同一个页面重复收录的问题。如果搜索引擎同时收录了其中的两个甚至三个URL,那么就会被判定为重复内容,降低对网站的评级,对网站SEO产生很大的影响。
为了解决这个问题,我们就需要确定一个统一格式的URL,并将另外两种格式的URL永久重定向到我们选定的URL上。经过前面的对比,格式2更加简洁、清晰,同时还有利于SEO。那么接下来,我们就介绍一下如何用Nginx将网站的URL格式统一成末尾带斜杠的格式。
用Nginx将 /a/b 重定向到 /a/b/
用Nginx给URL末尾添加斜杠其实很简单,Nginx自身的逻辑和配置就已经支持这种重定向,只需要简单配置一个路径映射即可:
配置好以后只需要注意一个问题,以 /a/b/
为例,a
文件夹下必须有一个 b
文件夹,不能有名称为 b
的文件,同时 b
文件夹下必须有一个默认页面文件(在上面的代码中是 index.html
)。
用Nginx将 /a/b/index.html 重定向到 /a/b/
针对这种情况,只需要在路径映射中将请求URL路径末尾的 /index.html
替换成 /
即可,我们用正则匹配来查找并完成替换:
上面配置代码中,第2行判断请求URL是否能够匹配正则表达式 ^(.*)/index.html(\?.*)?$
,即判断请求路径末尾(以及请求参数之前)是否是 /index.html
,如果匹配成功,那么就在第3行将 /index.html
替换成 /
,然后返回301永久重定向。
总结
通过上面的Nginx配置,我们就可以将网站的静态URL统一成末尾带斜杠的格式,将页面的流量集中到一个URL上,同时也有利于SEO。最后,在发网站外链时最好也都使用这种统一的格式,保持网站链接一致性。