2014-05-12 64 views
1

我一直在同一個問題掙扎了一段時間,現在我找不到一個好的答案。我正在使用rack-rewrite將一些url重寫規則添加到我的應用的中間件堆棧。url重寫模式生成許多重定向

我有以下規則:

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/' 

我怎麼能寫一個規則,會做那還是兩條規則,因爲我試過的東西沒有用?

+0

''[]'是一個[字符集](http://www.regular-expressions.info/charclass.html),不會做你認爲它的事情。 –

+0

我明白了,但是'[^ ...]'否定字符集?或者實際上它只適用於'[^ a-z]'或類似的東西? – Roland

+0

是的,你應該閱讀鏈接的文章,但基本上'[ab]'匹配a或b'[^ ab]'匹配任何不是a或b的字符,但只匹配*單個字符 –

回答

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

編輯:流浪括號。

+0

,這不起作用,你在每一行有一個額外的括號 – Roland

+0

看來,如果我嘗試像'http:// example.dev/docs /'這樣的命令,它會重定向循環並且瀏覽器崩潰... – Roland

+0

@rolandjitsu好點,在那個結尾的時候是一個正斜槓。現在修好。 –