我想要一個nginx的位置指令,將匹配所有網址以「XYZ」,而不是匹配「.PHP」定期expresssion匹配的東西,不符合的東西
我想這
location ~* /(.*)xyz/(.*)(?!\.php)(.*)$ {}
但它似乎總是匹配/ xyz/1和/xyz/1.php,但它應該只匹配/ xyz/1
我想要一個nginx的位置指令,將匹配所有網址以「XYZ」,而不是匹配「.PHP」定期expresssion匹配的東西,不符合的東西
我想這
location ~* /(.*)xyz/(.*)(?!\.php)(.*)$ {}
但它似乎總是匹配/ xyz/1和/xyz/1.php,但它應該只匹配/ xyz/1
感謝所有,我們終於想出了這個
location ~* ^/xyz([^.]*)/([^.]*)$ {
rewrite ^/xyz([^.]*)/([^.]*)$ /xyz$1/index.php/$2 last;
}
和它的作品
我不認爲你可以做到這一點,沒有單獨的正則表達式檢查,以確保「.php」不存在。問題是像.*
這樣的結構會吞下足夠多的字符,以確保您的負向視圖從不適用。
好,就像邁克爾說的那樣。 (注意'?')會使搜索不貪心,並且可以工作。
...或者,你可以嘗試(而hackish的):
[^.][^p][^h][^p]
強權的作品,可能不...這肯定是有點一個黑客攻擊。
您應該對位置的開始和結束有更具體的瞭解。如果.php
不應該在的位置的結束出現,把$
在先行斷言:
location ~* /(.*)xyz/(.*)(?!.*\.php$)(.*)$ {}
如果xyz
應該是一個正確的路徑段和第一路徑段(所以它必須與/xyz/
開始) ,使用這個:
location ~* ^/xyz/(?!.*\.php$)(.*)$ {}
混淆了'[^ a] [^ b]'我個人認爲,在最後的(。*)下,.php可能會以其他方式結束參數可能)在它之後。然而,^和$標記經常被遺忘,並且在適用時可以解決很多麻煩。 :d – 2010-10-23 15:55:13
這一個很簡單,但它可以很難看到。正則表達式中的第二個(。*)是「貪婪的」,因此,它將捕獲包括「.php」在內的所有內容,因此,對於解析器的「眼睛」,在它(它已經通過)之後沒有「.php」結果是一場比賽。 :(
只是使第二*懶通過改變它*,它會解決你的問題:?
location ~* /(.*)xyz/(.*?)(?!\.php)(.*)$ {}
我建議你閱讀this article,它解釋它比我一個更好的方法:d
這是。難以閱讀,調試,並且如果留在應用程序代碼中則需要相當多的評論。我認爲黑客應該只保留在沒有其他解決方案的情況下,並且解決方案在這裏很容易。 – 2010-10-23 15:50:53
這是錯誤的。當四個字符類別中的至少一個不能匹配時,它失敗。但是如果所有這些都不能匹配,它只會失敗。 – Gumbo 2010-10-25 06:52:17
我認爲你用'[^ ab]' – 2010-10-25 08:24:38