2010-10-23 67 views

回答

0

感謝所有,我們終於想出了這個

location ~* ^/xyz([^.]*)/([^.]*)$ { 
      rewrite ^/xyz([^.]*)/([^.]*)$ /xyz$1/index.php/$2 last; 
} 

和它的作品

1

我不認爲你可以做到這一點,沒有單獨的正則表達式檢查,以確保「.php」不存在。問題是像.*這樣的結構會吞下足夠多的字符,以確保您的負向視圖從不適用。

1

好,就像邁克爾說的那樣。 (注意'?')會使搜索不貪心,並且可以工作。

...或者,你可以嘗試(而hackish的):

[^.][^p][^h][^p] 

強權的作品,可能不...這肯定是有點一個黑客攻擊。

+0

這是。難以閱讀,調試,並且如果留在應用程序代碼中則需要相當多的評論。我認爲黑客應該只保留在沒有其他解決方案的情況下,並且解決方案在這裏很容易。 – 2010-10-23 15:50:53

+0

這是錯誤的。當四個字符類別中的至少一個不能匹配時,它失敗。但是如果所有這些都不能匹配,它只會失敗。 – Gumbo 2010-10-25 06:52:17

+0

我認爲你用'[^ ​​ab]' – 2010-10-25 08:24:38

2

您應該對位置的開始和結束有更具體的瞭解。如果.php不應該在的位置的結束出現,把$在先行斷言:

location ~* /(.*)xyz/(.*)(?!.*\.php$)(.*)$ {} 

如果xyz應該是一個正確的路徑段和第一路徑段(所以它必須與/xyz/開始) ,使用這個:

location ~* ^/xyz/(?!.*\.php$)(.*)$ {} 
+0

混淆了'[^ a] [^ b]'我個人認爲,在最後的(。*)下,.php可能會以其他方式結束參數可能)在它之後。然而,^和$標記經常被遺忘,並且在適用時可以解決很多麻煩。 :d – 2010-10-23 15:55:13

1

這一個很簡單,但它可以很難看到。正則表達式中的第二個(。*)是「貪婪的」,因此,它將捕獲包括「.php」在內的所有內容,因此,對於解析器的「眼睛」,在它(它已經通過)之後沒有「.php」結果是一場比賽。 :(

只是使第二*懶通過改變它*,它會解決你的問題:?

location ~* /(.*)xyz/(.*?)(?!\.php)(.*)$ {} 

我建議你閱讀this article,它解釋它比我一個更好的方法:d