2012-12-16 49 views
1

我試圖改變使用Nginx的URL重寫系統..簡單,最後還是中斷?

http://site.com/show_page.php?name=terms 

http://site.com/pages/terms.html 

我通常不錯具有設置幾個站點,做了一些工作,在過去的Nginx。這是我的URL重寫,在conf虛擬主機 - 我試圖用last替換break,但沒有運氣。

location /pages { 
    rewrite ^/pages/(.*)$.html /show_page.php?name=$1? break; 
} 

回答

2

在你的語句中的美元符號不屬於那裏。美元符號表示字符串的結尾。所以沒有什麼可以成功的比賽之後。其餘的重寫是正確的,你可以忽略jagsler關於無法找到php語句的評論。這是不正確的,正如文檔中清楚說明的那樣,最後一條指令將指示nginx搜索新的位置以匹配。由於該語句將URL重寫爲不匹配位置塊的其他位置,因此它也沒有循環的機會。

+0

這是我的想法。我原本是關於關閉和移動PHP的一點想法......也許他不明白。我感謝你對此的解釋。 – TheBlackBenzKid

+0

'location/pages {\t rewrite ^/pages /(.*)。html /show_page.php?name=$1?打破; '這是你的意思,請張貼樣品 – TheBlackBenzKid

0

有兩個原因不起作用。首先你的重寫規則是不正確的,修改成:

rewrite ^/pages/(.*).html$ /show_page.php?name=$1? last; 

而第二個是,當你改寫這樣的nginx不知道如何處理PHP文件,因爲它從來沒有達到location ~ \.php塊。你可以通過將完整的location ~ \.php放在一個名爲php.conf的不同文件(或任何你喜歡的文件)中來解決這個問題,並將它包含在你的服務器塊中的任何你需要的地方。

這可能會看起來是這樣的:

server { 
    # you config here (servername, port, etc.) 

    location /pages { 
     rewrite ^/pages/(.*).html$ /show_page.php?name=$1? last; 
     include php.conf; 
    } 

    # instead of the php location block also just add the include 
    include php.conf; 
} 
2

jagsler答案是確定 但一個必須記住這一點:

server { 
    # you config here (servername, port, etc.) 

    location /pages { 
     #***modified . = any character, so escape literal dots*** 
     rewrite ^/pages/(.*)\.html$ /show_page.php?name=$1? last; 
     #***the line bellow will only be executed if the rewrite condition*** 
     #***equals false, this is due to the "last" modifier in the rewrite rule*** 
     include php.conf; 
    } 

    # instead of the php location block also just add the include 
    include php.conf; 
} 

所以要注意對改性劑以重寫規則 「最後」的行爲,如果重寫條件等於true,則意味着重寫所請求的uri並跳轉到適合新重寫的uri的位置塊。

另一個修改是「破發」,如果重寫條件等於真至極意味着重新寫請求的URI但不跳,而不是停留在同一位置的塊,並繼續到下一行的塊內