Google 搜索控制台报告说我的网站有许多不存在的 URL,这些 URL 属于博客文章,并且在请求时抛出 404。
此外,我们最近还更新了网站博客文章的永久链接,以实现更好的 SEO 和分类帖子。
为了解决这个问题,我将旧的永久链接重定向到新规则和不存在的 404 页面以返回 410 状态。
以下是作品:
server {
# ...
# 1. Return "410 Gone" to all non-existing blog posts, which follows old permalink style
# So requests like below will be served with status code 410
# /family-tour-packages-are-coming-soon-315/
# /black-bikers-team-won-the-match-yesterday-1116/
location ~* ^/[a-z0-9-]+-(315|1116|1104|311|341|339)/?$ {
return 410;
}
# 2. Re-direct old permalink style to new style prefixed with /category-slug
# /post will be replaced by /category-slug by back-end script
# Actually 2 redirect will be made always on old permalink request
# So requests like: /kia-motors-shares-jump-after-report-apple-to-invest-3-6-billion-2248/
# will be redirected by Nginx to /post/kia-motors-shares-jump-after-report-apple-to-invest-3-6-billion-2248/
# and back-end script will finally redirect to /news/kia-motors-shares-jump-after-report-apple-to-invest-3-6-billion-2248/
rewrite ^/([a-zA-Z0-9_-]+\-[\d]+)/?$ /post/$1/ redirect;
# ...
}
但在这种情况下,location
块将被忽略并且重写规则始终会发生。
我该怎么做才能为特定匹配返回 410 并为其他匹配重定向?
答案1
将rewrite
规则放入块中location /
。这样 nginx 就会选择第location
一个,然后应用该规则location
。
答案2
Tero Kilkanen 的上述回答非常有效。
此外,我还找到了另一种解决方法。我没有返回 410,而是将它们全部重定向到主页 (/)。因此,我更改了代码,如下所示:
# From this
location ~* ^/[a-z0-9-]+-(315|1116|1104|311|341|339)/?$ {
return 410;
}
# to this
rewrite ^/[a-z0-9-]+-(315|1116|1104|311|341|339)/?$ / redirect;
这是最后一个:
server {
# ...
rewrite ^/[a-z0-9-]+-(315|1116|1104|311|341|339)/?$ / permanent;
rewrite ^/([a-zA-Z0-9_-]+\-[\d]+)/?$ /post/$1/ permanent;
# ...
}