2013-03-19 78 views
5

這似乎很荒謬,但我還沒有找到一個小時的搜索工作的答案。nginx靜態索引重定向

我有一個運行nginx的靜態網站(恰好在Varnish後面)。索引文件被稱爲index.html。我想將任何實際訪問網址mydomain.com/index.html的人重定向回mydomain.com

這裏是我的網站nginx的配置:

server { 
    listen 8080; 
    server_name www.mydomain.com; 
    port_in_redirect off; 

    location/{ 
    root /usr/share/nginx/www.mydomain.com/public; 
    index index.html; 
    } 

    rewrite /index.html http://www.mydomain.com/ permanent; 
} 

http://www.mydomain.com/index.html響應預期與301與位置http://www.mydomain.com/可惜http://www.mydomain.com/還供應301回自己,所以我們得到一個重定向循環。

如果index.html字面上在請求中,我該如何告訴nginx只服務於301?

回答

7

添加一個新的位置塊來處理您的主頁,並使用try_files指令(而不是「index index.html」)直接查找index.html文件。請注意,try_files要求您輸入至少2個選項。所以我把兩個文件放在一起。

location =/{ 
    root /usr/share/nginx/www.mydomain.com/public; 
    try_files /index.html /index.html; 
} 

根據我的實驗看起來不錯:

curl -iL http://www.mydomain.com/index.html 
HTTP/1.1 301 Moved Permanently 
Server: nginx 
Date: Sat, 16 Mar 2013 09:07:27 GMT 
Content-Type: text/html 
Content-Length: 178 
Connection: keep-alive 
Location: http://www.mydomain.com/ 

HTTP/1.1 200 OK 
Server: nginx 
Date: Sat, 16 Mar 2013 09:07:27 GMT 
Content-Type: text/html 
Content-Length: 4 
Last-Modified: Sat, 16 Mar 2013 08:05:47 GMT 
Connection: keep-alive 
Accept-Ranges: bytes 

[UPDATE] 重定向循環的根本原因是「指數」的指令,從而引發的nginx做另一輪的位置再次匹配。這就是位置塊外部的重寫規則再次執行的原因,導致了循環。所以'index'指令就像是「重寫......最後一個」指示。你不希望你的情況。

訣竅是不再觸發另一個位置匹配。 try_files可以有效地做到這一點。這就是爲什麼我選擇了原來的答案。但是,如果你喜歡,另一個簡單的解決方法是

rewrite ^/$ /index.html break; 

你原來的 「位置/」 塊內更換

index index.html; 

。這'重寫...打破;'指令將保持nginx停留在同一個位置塊內,從而有效地停止循環。然而,這種方法的副作用是你失去了'index'指令提供的功能。

[UPDATE 2]

實際上,索引指令改寫指令之後執行。所以以下也是有效的。請注意,我剛剛添加了重寫... break;線。如果請求URI是「/」,nginx會先從重寫規則中找到現有文件/index.html。所以索引指令永遠不會被觸發。因此,這兩個指令可以一起工作。

location/{ 
    root /usr/share/nginx/www.mydomain.com/public; 
    index index.html; 
    rewrite ^/$ /index.html break; 
    } 
+0

謝謝,這是有效的。我不明白爲什麼會停止重定向循環,但它確實如此。也許'try_files'有點神奇。你能解釋爲什麼將'try_files /index.html /index.html;'行放入_existing_位置塊不起作用嗎? (我試過了)。乾杯。 – Ade 2013-03-19 10:37:08

+0

由於@ chuan-ma解決了你的問題,不要忘了標記他的答案爲接受:) – 2013-03-19 11:42:03

+0

@Ade我會在今晚稍後解釋。 – 2013-03-19 13:38:49

-1

看起來像你真的不想index.php顯示在地址欄中,是正確的嗎?

如果您將重寫指令添加到nginx配置中,您將得到一個重定向循環,就像您所經歷的那樣。如果你是開放的一個JavaScript的解決方案,您可以將您的index.html這在任何地方默默地改寫地址欄:

<script> 
    history.pushState(null, '', '/'); 
</script> 

For more information

請記住,雖然大部分現代瀏覽器支持history API,而不是都做到了(即IE的大多數版本)。

+0

謝謝;是的,我知道幾種應用級別的重定向方式,但希望在服務器級別進行配置,因爲它將在多個應用程序中重複使用。 – Ade 2013-03-19 10:40:06