Redirect 301在重定向整个域/全部捕获之前重定向Nginx中的特定页面

Redirect 301在重定向整个域/全部捕获之前重定向Nginx中的特定页面,redirect,nginx,url-redirection,http-status-code-301,Redirect,Nginx,Url Redirection,Http Status Code 301,我有数千页要在nginx中重定向。我可以使用 return 301 https://www.newdomain.com$request_uri; 然而,我想将大约6页重定向到新域上更改的slug/path,例如 location /old-path/ { rewrite ^ https://www.newdomain.com/newpath/ permanent; } 我已经试过了,但看不出如何先重定向这6个,特别是,然后将“一网打尽”规则应用于其他所有内容 目前,我只使用

我有数千页要在nginx中重定向。我可以使用

return 301 https://www.newdomain.com$request_uri;
然而,我想将大约6页重定向到新域上更改的slug/path,例如

   location /old-path/ {
   rewrite ^ https://www.newdomain.com/newpath/ permanent;
   }
我已经试过了,但看不出如何先重定向这6个,特别是,然后将“一网打尽”规则应用于其他所有内容

目前,我只使用catch all在旧域上重定向,然后让新域上的301s将6条帖子更改为新路径(这6条帖子总共重定向了2条)

我想实现上述目标,不仅是为了将这6个页面的重定向减少到1,还因为我想将这6个页面中的一个重定向到新域上的新路径,但它的旧路径在新域上仍然作为(新)页面存在(因此我需要在旧域上重定向它,而不是在新域上)。例如:

server {
    ...
    rewrite ^/old-path/ https://www.newdomain.com/newpath/ permanent;
    rewrite ^/...       https://www.newdomain.com/.../     permanent;
    return 301          https://www.newdomain.com$request_uri;
}
location / {
    return 301 https://www.newdomain.com$request_uri;
}
location /old-path/ {
    rewrite ^ https://www.newdomain.com/newpath/ permanent;
}
如果将
rewrite
语句包装在
location
块中,则
return
语句也必须包装在
location
块中。例如:

server {
    ...
    rewrite ^/old-path/ https://www.newdomain.com/newpath/ permanent;
    rewrite ^/...       https://www.newdomain.com/.../     permanent;
    return 301          https://www.newdomain.com$request_uri;
}
location / {
    return 301 https://www.newdomain.com$request_uri;
}
location /old-path/ {
    rewrite ^ https://www.newdomain.com/newpath/ permanent;
}

谢谢@richard,这似乎奏效了!但我注意到,如果我有如下规则:
rewrite^/archive page/https://www.newdomain.com/new1/new2/ 永久的;重写^/存档页/old1/https://www.newdomain.com/new3/ 永久的
然后/archive page/之后的所有内容,例如/archive page/old1/也将重定向到第一条规则。有什么办法可以解决这个问题吗?大家好,我想我用:
if($request_uri=“/archive1/”){rewrite^修复了上面的问题https://www.newdomain.com/new1/new2/ 永久;}if($request_uri=“/archive1”){rewrite^https://www.newdomain.com/new1/new2/ 永久;}
我实现了这一点,并且在/archive1/之后的所有内容,例如/archive1/324324/都按照我的其他规则正确重定向。您可以根据需要使正则表达式具体化,更具体的正则表达式应该放在不太具体的正则表达式之前。如果需要精确匹配,请在正则表达式中添加尾随的
$
。很抱歉,我不太理解最后一部分-目前conf文件中规则的顺序是:1。if语句规则(其中2条)2。重写规则(约60)3。返回规则(1规则)。我应该改变顺序吗?另外,我想你们是说我可以用
$
来优化事情,但再次抱歉,我真的不知道具体放在哪里。它是否替换if语句中的
?或者,如果我使用
$
,我是否不需要if语句(并且可以执行正常的重写规则)-因此它将是
rewrite^/archive1/$。。。永久的
如果($request_uri=“/archive1/”)
作为正则表达式写入时与
^/archive1/$
相同。因此,您的
if
块可以替换为
rewrite^/archive1/$https://www.newdomain.com/new1/new2/ 永久的