1

我有一个网站,它曾经是用 PHP 编写的,我用 Rails 重新编写了。它本质上是一个由帖子组成的博客平台。我仍然使用旧的 URL 方案收到来自 Google 的请求。他们正在呈现索引页面,但他们应该显示引用的特定帖子。例如:

http://domain.com/posts?page=5&postID=6433(渲染索引,第 5 页)

应该:

http://domain.com/posts/6433(显示帖子 6433)

page 参数可以丢弃,它用于评论分页,不再需要。这两个参数都以 params[:page] 和 params[:postID] 的形式传递给 Rails,并转到 post 控制器中的 index 操作。我想可以在控制器中添加一些逻辑(如果 :postID 存在,则显示正确的帖子),但我认为正确的方法是使用 nginx 重写来修改 url,目前我正在使用:

rewrite "^/posts\?page=(.*)&postID=(.*)$" /posts/$2 break;

它似乎对传递的 URL 没有任何影响。

我正在寻求帮助以制作正确的重写 URL 或 RoR 路由。

4

2 回答 2

1

?则表达式中具有特殊含义——它指定它之前的表达式(在本例中为字母s)预计会出现 0 次或 1 次。

您需要?使用 a转义\

rewrite "^/posts\?page=(.*)&postID=(.*)$" /posts/$2 break;
于 2013-02-10T21:28:08.743 回答
0

这是我解决这个问题的方法:

if ($arg_postID ~ "^([0-9]+)"){
  rewrite ^/(.*) /posts/$arg_postID? permanent;
}

成功转身

http://ihatethemarinecorps.com/posts?page=5&postID=8861

进入

http://ihatethemarinecorps.com/posts/8861

结果 nginx 处理参数(之后的任何内容?)与 URI 的其余部分略有不同。我也可以在重写中访问 $arg_page,但没有必要。如果您有更好的答案,请告诉我。

于 2013-02-12T01:38:34.510 回答