Aggiungi un nuovo blocco di posizione per gestire la tua home page e utilizza la direttiva try_files (anziché "index index.html;") per cercare direttamente il file index.html. Nota che try_files richiede di inserire almeno 2 scelte. Quindi ho messo lo stesso file due volte.
location =/{
root /usr/share/nginx/www.mydomain.com/public;
try_files /index.html /index.html;
}
Sembra buono in base alla mia esperienza:
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] La causa principale del loop di reindirizzamento è la direttiva 'indice', che innesca nginx di fare un altro giro di posizione abbinare di nuovo. È così che la regola di riscrittura esterna al blocco di posizione viene nuovamente eseguita, causando il loop. Quindi la direttiva 'indice' è come una "riscrittura ... ultima;" direttiva. Non lo vuoi nel tuo caso.
Il trucco è di non attivare nuovamente un'altra corrispondenza di posizione. try_files può farlo in modo efficiente. Ecco perché l'ho scelto nella mia risposta originale. Tuttavia, se si vuole, un altro semplice soluzione è quella di sostituire
index index.html;
da
rewrite ^/$ /index.html break;
all'interno del vostro "/ posizione" blocco originale. Questa 'riscrittura ... interrompe;' la direttiva manterrà nginx all'interno dello stesso blocco di posizione, fermando effettivamente il ciclo. Tuttavia, l'effetto collaterale di questo approccio è che si perde la funzionalità fornita dalla direttiva "indice".
[UPDATE 2 ]
In realtà, la direttiva indice viene eseguito dopo direttiva riscrittura. Quindi funziona anche il seguente. Nota che ho appena aggiunto la riscrittura ... break; linea. Se la richiesta uri è "/", nginx trova prima il file /index.html esistente dalla regola di riscrittura. Quindi la direttiva index non viene mai attivata per questa richiesta. Di conseguenza, entrambe le direttive possono lavorare insieme.
location/{
root /usr/share/nginx/www.mydomain.com/public;
index index.html;
rewrite ^/$ /index.html break;
}
Grazie, funziona. Non capisco davvero perché questo fermi il ciclo di reindirizzamento, ma lo fa. 'try_files' è un po 'magico forse. Puoi spiegare perché la linea 'try_files /index.html /index.html;' nel blocco posizione _existing_ non funziona? (Ci ho provato). Saluti. – Ade
Poiché @ chuan-ma ha risolto il tuo problema, non dimenticare di contrassegnare la sua risposta come accettata :) –
@Ade ti spiegherò più tardi stasera. –