Nginx:位置和重写均针对类似的模式挑战

Nginx:位置和重写均针对类似的模式挑战

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;
    # ...
}

相关内容