0

我在Roda上有博客 Web 应用程序,其中链接具有以下 URL 格式:example.com/posts/<id>/<slug>.

例如example.com/posts/1/example-blog-post.

我想要实现的是将用户重定向到example.com/posts/1/example-blog-post,以防他访问:

  1. example.com/posts/1 或
  2. example.com/posts/1/(注意最后一个反斜杠)

到目前为止,这就是我在路线中得到的:

r.on /posts\/([0-9]+)\/(.*)/ do |id, slug|
  @post = Post[id]

  if URI::encode(@post[:slug]) == slug
    view("blogpage")
  else
    r.redirect "/posts/#{id}/#{@post[:slug]}"
  end
end

使用此代码:

  1. example.com/posts/1 -失败
  2. example.com/posts/1/ -好的

我可以同时满足这两个条件吗?

4

1 回答 1

1

您可以将正斜杠后跟第二个捕获组包装在可选的非捕获组中:

posts\/([0-9]+)(?:\/(.*))?

解释

  • posts\/匹配posts/
  • ([0-9]+)捕获组 1,匹配 1+ 位
  • (?:非捕获组
    • \/(.*)在第 2 组中匹配/和捕获 0+ 次除换行符以外的任何字符
  • )?关闭非捕获组并使其可选

正则表达式演示

于 2020-03-26T07:26:26.660 回答