添加一個新的位置塊來處理您的主頁,並使用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;
}
謝謝,這是有效的。我不明白爲什麼會停止重定向循環,但它確實如此。也許'try_files'有點神奇。你能解釋爲什麼將'try_files /index.html /index.html;'行放入_existing_位置塊不起作用嗎? (我試過了)。乾杯。 – Ade 2013-03-19 10:37:08
由於@ chuan-ma解決了你的問題,不要忘了標記他的答案爲接受:) – 2013-03-19 11:42:03
@Ade我會在今晚稍後解釋。 – 2013-03-19 13:38:49