2017-04-21 118 views
1

我在想如何爲nginx編寫正確的重寫,因爲它每次都會失敗。NGINX動態URL的重寫規則

我有一個頁面,可以訪問沒有任何動作(http://foo.bar/praemienshop/)或在url中的參數,然後觸發一個動作(http://foo.bar/praemienshop/1)。該參數應始終爲數字。如果可能的話,如果沒有給出參數,結束斜線應該是可選的。 這是我tryed:

location /praemienshop { 
     rewrite ^/praemienshop(|/)([0-9]+/.*?)?$ /index.php?url=praemienshop&item=$1; 
} 

蔭能開foo.bar/praemienshop但每次我打開foo.bar/praemienshop/3(或任何其他數值),它只是拋出沒有找到404。

我既不擅長編寫正則表達式,也不完全瞭解在nginx中如何重寫。我曾在IIS中工作,但將它導入nginx很難。

感謝您的任何幫助。

+0

'$ 1'是第一個捕獲'(| /)' - 你應該嘗試'$ 2'。 –

+0

感謝您的幫助理查德。但是這不能解決它。如果我添加一個數字,它仍會拋出一個404(例如:foo.bar/praemienshop/3) –

回答

1

正如您目前所擁有的,您正在使用錯誤的捕獲並且正則表達式與URI不匹配。嘗試:

rewrite ^/praemienshop(?:/([0-9]+))?$ /index.php?url=praemienshop&item=$1; 

在上述正則表達式,所述(?:是一個非捕獲基團。

請參閱this useful resource on regular expressions

+0

非常感謝,這就像一個魅力!我還有很多東西要學習正則表達式;-) –

+0

我還有一個問題理查德,我怎麼能重寫一個url,如果用戶輸入一個帶有結尾.gif的url,.gif被移除,文件名被重寫一個參數就像上面的例子一樣? –

+0

像'^(。*)\。gif $'這樣的結構將捕獲URI減去擴展名。 –