我正在尝试网站切换。我们想通过使用 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;
}
....
}