Nginx的 – redirect老.php?id = …到SEO友好的url不会按预期redirect

我正在将旧式/category.php?id=4url的网站迁移到/ category / seo-friendly-slugurl。

rewrite ^/category.php?id=1$ /styles-de-bieres-belges/pils permanent; rewrite ^/category.php?id=2$ /styles-de-bieres-belges/bieres-blanches permanent; rewrite ^/category.php?id=4$ /styles-de-bieres-belges/lambics-et-gueuzes permanent; rewrite ^/category.php?id=5$ /styles-de-bieres-belges/ales-stouts-et-ipa permanent; rewrite ^/category.php?id=6$ /styles-de-bieres-belges/bieres-trappistes permanent; rewrite ^/category.php?id=7$ /styles-de-bieres-belges/bieres-d-abbaye permanent; rewrite ^/category.php?id=8$ /styles-de-bieres-belges/bieres-rouges-des-flandres permanent; rewrite ^/category.php?id=9$ /styles-de-bieres-belges/lambics-et-gueuzes permanent; rewrite ^/category.php?id=11$ /styles-de-bieres-belges/bieres-fruitees permanent; rewrite ^/category.php$ /styles-de-bieres-belges permanent; 

但所有'/category.php?id=...'请求都会redirect/styles-de-bieres-belges (最后一行)。 如果我删除这最后一行,它根本不redirect。

这个设置有什么问题?

停止使用这些ifs或那些具有类似匹配URI的整个重写。 这将更容易阅读和维护。 这也将避免性能问题,因为重写规则正则expression式是按顺序testing的。

使用地图

 map $arg_id $target { "1" "pils"; "2" "bieres-blanches"; "4" "lambics-et-gueuzes"; "5" "ales-stouts-et-ipa"; "6" "bieres-trappistes"; "7" "bieres-d-abbaye"; "8" "bieres-rouges-des-flandres"; "9" "lambics-et-gueuzes"; "11" "bieres-fruitees"; } server { ... location /category { rewrite ^/category.php$ /styles-de-bieres-belges/$target? permanent; } } 

查询string被转换为重写规则中的variables,并被删除。 对于你的例子,所有的重写引擎看到的是category.php ,但是存储了$arg_id值。

尝试这样的事情:

 location = /category.php { if ($arg_id = "1") {rewrite ^ /styles-de-bieres-belges/pils permanent;} if ($arg_id = "2") {rewrite ^ /styles-de-bieres-belges/bieres-blanches permanent;} ... the rest of them ... if ($arg_id !~ "^\d+$") {rewrite ^ /styles-de-bieres-belges permanent;} }