我确定以前已经问过这个问题,但是找不到有效的解决方案。仅一页?

例如

旧页面

http://sitedomain.co.uk/content/unique-page-name

新页面

http://sitedomain.co.uk/new-name/unique-page-name

请注意,我不希望内容页面中的所有内容都被重定向,但实际上只是上面提到的网址。我大约要设置9个重定向,但都不适合某个模式。

谢谢!它重定向时没有斜线的事实:

if ( $request_filename ~ content/unique-page-name/ ) {
   rewrite ^ http://sitedomain.co.uk/new-name/unique-page-name/? permanent;
}


,但这重定向到:

http://sitedomain.co.uknew-name/unique-page-name/

#1 楼

陷阱和常见错误的直接报价:税收重写:


通过使用return指令,我们可以完全避免对正则表达式求值。使用return而非rewrite进行永久重定向。这是我使用此用例的方法...

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}


评论


绝对更具可读性。这还会保留原始URL上的任何查询吗?

– SteveEdson
13-10-25在9:56

我认为Nginx中使用if语句不好是正确的吗?与使用重写方法相比,这还是更好的做法吗?

– SteveEdson
13-10-25在10:10

将if与return指令一起使用是完全可以的。参见wiki.nginx.org/IfIsEvil。是的,IMO,比使用重写更好。

–波西·卡利穆图(Pothi Kalimuthu)
13-10-25在10:22

为什么返回……而不是重写……永久;进行永久重定向?是否有理由为什么应该这样呢?在当前答案中,不再有if语句,为什么?

–luckydonald
20年8月5日,11:30

请参阅答案中引用的文字。

–波西·卡利穆图(Pothi Kalimuthu)
20年8月6日,下午1:23

#2 楼

理想情况下,如果可以避免,则不应使用if语句。这样的事情可能会起作用(未试用)。

location ~ /content/(.*)$ {
    rewrite ^ /new-name/?$args permanent;
} 


评论


那不会捕获内容目录中的所有内容吗?我只想重定向单个项目。例如,我在内容目录中还有另一个项目,但是我需要将其重定向到... / another-new-name / unique-page-name2

– SteveEdson
13-10-25在9:20

我已经解决了原来它正确重定向,但是脚本被击中之后才处理URL。

– SteveEdson
13-10-25在9:31

啊,我误解了这个问题。我以为您只希望更改内容部分。原理保持不变。我很高兴为您工作。

–́Gevious
13-10-25在9:37

没问题,不过感谢您的帮助,我以后肯定需要使用它。

– SteveEdson
13-10-25在9:54

#3 楼

我使用以下解决方案:

rewrite ^(/content/unique-page-name)(.*)$   http://sitedomain.co.uk/new-name/unique-page-name/ permanent;


请客。

#4 楼

对我来说,它没有这样的等号就可以工作:

location /old-url {
  return 301 /new-url;
}


评论


您根本不需要位置限制。只需使用重写。请参阅@SteveEdison的答案。

–PKHunter
17-2-26在0:46

@PKHunter根据NGINX最佳实践,实际上返回301是遵循的最佳方法。 nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/…

– Cristian E.
20-10-21在9:39

#5 楼

它对我有用。
server {
  listen 80;

  location = /content/unique-page-name {
    return 301 http://sitedomain.co.uk/new-name/unique-page-name;
  }
}