url重写模式生成许多重定向

时间:2014-05-12 16:28:02

标签: ruby regex rewrite rack

我一直在努力解决同样的问题一段时间,但我找不到一个好的答案。我正在使用rack-rewrite向我的应用中间件堆栈添加一些网址重写规则。

我有以下规则:

r301 %r{^/([^(docs|help|legal|login|account|apps)])(.+)/$}, '$1'

哪种方式不正常或正如我所料。我已经尝试了我之前的问题answer之一,但这两种情况都不起作用,它实际上会生成一个更奇怪的事件(它重定向到没有域名的URL,只是路径)。

我想做的是:

  • 如果用户请求http://example.com/http://example.com/random-path/我需要重写规则来删除斜杠,因此示例将分别变为http://example.com http://example.com/random-path;
  • 如果请求的路径与列表docs|help|legal|login|account|apps中的任何路径匹配,请不要在路径末尾删除斜杠(如果存在),但如果不存在则添加斜杠

我尝试了两个规则,一个忽略上面列出的路径并删除斜线,一个添加斜杠,如果它从列表中点击某些东西并且路径不在那里之后的斜杠:

r301 %r{^/([^(docs|help|legal|login|account|apps)])(.+)/$}, '/$1'
r301 %r{^/([(docs|help|legal|login|account|apps)])(.+)/$}, '/$1/'

我怎么能写一个可以做到这一点的规则,或者两个规则,因为我尝试过的规则不起作用?

1 个答案:

答案 0 :(得分:2)

你可以这样做:

r301 %r{^/((?!docs|help|legal|login|account|apps).+)/$}, '/$1'
r301 %r{^/((?=docs|help|legal|login|account|apps).+[^/])$}, '/$1/'

example 1

example 2

some documentation on lookahead and lookbehind

编辑:流浪的括号。