Nginx将一条路径重定向到另一条路径


51

我敢肯定这已经被问过了,但是我找不到可行的解决方案。

一个网站已切换了CMS服务,但具有相同的域,如何为单个页面设置nginx重写?

例如

旧页

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

新的一页

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

请注意,我不希望内容页面中的所有内容都被重定向,而实际上只是上面提到的url。我大约要设置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/

Answers:


87

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

通过使用return指令,我们可以完全避免对正则表达式求值。

请使用return而不是rewrite进行永久重定向。这是我处理此用例的方法...

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

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

1
不。不会的 如果您真的想保留有关永久重定向的任何查询,请参见此小技巧... gist.github.com/pothi/7152399
Pothi Kalimuthu 2013年

1
我是否认为if在nginx 中使用语句是不好的?与使用重写方法相比,这还是更好的做法吗?
SteveEdson

1
使用if连同返回指令是完全正常的。参见wiki.nginx.org/IfIsEvil。是的,IMO,比使用重写更好。
Pothi Kalimuthu 2013年

13

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

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

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

1
我已经解决了 原来它正确重定向,但是脚本被击中之后才对URL进行了修改。
SteveEdson

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

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

12

我使用以下解决方案:

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

工作请客。


8

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

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

2
您根本不需要位置限制。只需使用rewrite。请参阅@SteveEdison的答案。
PKHunter '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.