nginx 和 try_files:在回退之前尝试使用重写命名位置

nginx 和 try_files:在回退之前尝试使用重写命名位置

我正在尝试网站切换。我们想通过使用 301 重定向来保留我们的外部链接。我在命名位置有一个很长的重定向列表,类似于:

location @redirects {       
    rewrite ^/path/one.html$ http://www.ourdomain.tld/one-but-different permanent;
    rewrite ^/path/two.html$ http://www.ourdomain.tld/two-but-different permanent;
    rewrite ^/path/three.html$ http://www.ourdomain.tld/three-but-different permanent;
    rewrite ^/path/four.html$ http://www.ourdomain.tld/four-but-different permanent;
}

(请注意,尽管我的例子似乎显示了一种模式,但实际上并不存在任何模式。换句话说,它们是一对一的重定向。)

我有一个 CMS Web 应用程序,目前正在使用以下 try_files 语句(该语句一直在努力回退到 index.php 脚本):

location / {
    try_files $uri $uri/ /index.php;
}

现在我尝试使用 try_files “查看”名为 location 的重定向,并在返回 index.php 之前处理重写。如下所示:

location / {
    try_files @redirects $uri $uri/ /index.php;
}

然而,每次 CMS 处理 404 时都会触发回退。换句话说,如果我尝试http://www.ourdomain.tld/path/one.html,我的 CMS 出现了 404 页面,而不是重定向!是否可以先“尝试”命名位置,还是必须将命名位置作为后备?

我确信我做错了。但是,有人能给我指出正确的方向吗?

nginx/1.2.4

谢谢!

答案1

正确的做法是:

location = /path/one.html {
    return 301 http://www.ourdomain.tld/one-but-different;
}

location = /path/two.html {
    return 301 http://www.ourdomain.tld/two-but-different;
}

etc...

请尽可能避免使用重写。Nginx 不是 Apache。URL 重写是一种配置 Web 服务器的低效且棘手的方法。Nginx 更喜欢 URL 映射。前缀location匹配非常快速且高效。

https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/

--

如果重定向数量非常多(500+),则:

map $uri $redirect_to {
    include /path/to/redirects.map;
}

server {
    location / {
        if ($redirect_to) {
             return 301 http://www.ourdomain.tld$redirect_to;
        }
    }
}

重定向.映射:

/path/one.html /one-but-different;
/path/two.html /two-but-different;
etc...

答案2

另一种方法是使用地图

一个例子;首先检查语法错误...:

map $uri $new {
  /path/one.html http://www.example.com/new_path_one;
  /path/two.html http://www.example.com/new_path_two;
}

server {
  if ($new) {
    return 301 $new;
  }
  ....
}

相关内容