2013-09-04 2 views
10

Ho questa struttura: site.com/api/index.php. Quando invio dati a site.com/api/ non c'è alcun problema, ma immagino che sarebbe meglio se l'API funzionasse anche senza la barra finale, come questa: site.com/api. Ciò causa un reindirizzamento 301 e quindi perde i dati (poiché i dati non vengono inoltrati). Ho provato ogni riscrittura a cui potevo pensare e non ho potuto evitare il reindirizzamento. Questa è la mia attuale regola di riscrittura (sebbene possa essere irrilevante).Come accedere all'indice index.php senza una barra finale E non ricevere il reindirizzamento 301

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^api/(.*)$ api/index.php [L] 

Posso fare in modo che l'URL funzioni e conservare i dati del post senza utilizzare la barra finale?

Alcuni riscrive che non ha funzionato: (tutti ancora reindirizzamento)

RewriteRule ^api$ api/index.php [L] 
RewriteRule ^api/*$ api/index.php [L] 
+0

la barra finale è aggiunto dal apache modulo mod_dir: http://httpd.apache.org/docs/2.2/mod/mod_dir.html –

+0

Inoltre, la regola di riscrittura, nel modo in cui è scritta, ha la barra finale come parte della regola. Probabilmente potresti semplicemente rimuovere '/' dalla regola e funzionerebbe. –

+0

Giusto. Stavo pensando che avrei potuto riscrivere una richiesta a quella directory proprio su index.php in modo che il modulo non entrasse mai in funzione, ma non funzionava. Aggiornerò per mostrare ciò che ho provato lì. – m59

risposta

11

Faresti prima necessario disattivare directory slash, ma c'è un motivo per cui è molto importante che ci sia una barra finale:

Mod_dir docs:

Spegnimento del slash reindirizzamento può causare la divulgazione di informazioni. Si consideri una situazione in cui mod_autoindex è attivo (Options +Indexes) e DirectoryIndex è impostato su una risorsa valida (ad esempio, index.html) e non esiste un altro gestore speciale definito per tale URL. In questo caso, una richiesta con una barra finale mostrerà il file index.html. Ma una richiesta senza barra finale elencerebbe il contenuto della directory.

Ciò significa accedere a una directory senza una barra finale sarà sufficiente elencare il contenuto delle directory invece di servire l'indice predefinito (per esempio index.php). Quindi, se si desidera attivare directory taglio su off, è necessario assicurarsi di riscrivere internamente allo slash indietro nel.

DirectorySlash Off 

RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.*[^/])$ /$1/ 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^api/(.*)$ api/index.php [L] 

La prima regola assicura che la barra finale viene aggiunto alla fine, anche se solo internamente. A differenza di mod_dir, che reindirizza esternamente il browser, la riscrittura interna è invisibile al browser. La regola successiva è quindi il routing API e, a causa della prima regola, è garantita la presenza di una barra finale.

+0

Questo è certamente l'unico modo per evitare il reindirizzamento mentre il modulo è abilitato? – m59

+0

Inoltre, è comune per gli host condivisi consentire questa modifica? Li ho trovati severi riguardo certe cose del genere. – m59

+1

@ m59 Non esiste alcun modo per evitare il reindirizzamento mentre 'DirectorySlash' di mod_dir è attivato. Puoi evitare il reindirizzamento spegnendolo, ma mod_dir elabora l'URI prima che mod_rewrite lo faccia (quasi sempre) quindi non c'è modo di aggirarlo. Non so quanto siano rigidi i servizi di hosting su questo. Ma 'DirectorySlash' fa parte dell'override di" Indexes ", quindi è molto probabile che lo consentano. –

0

Se non si desidera utilizzare la soluzione fornita da Jon Lin (riconfigurando tutti gli URL che puntano a directory), è possibile utilizzare il seguente codice (si noti il? Nell'espressione regolare - in pratica dice che la barra finale dopo " api "è facoltativo). Non ho ancora testato, ma dovrebbe funzionare così com'è:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^api/?(.*)$ api/index.php [L] 
+0

Ho provato esattamente quello. La barra opzionale non aiuta, né rimuove del tutto la barra per essere certi. – m59

+0

Sono abbastanza sicuro che non funzioni perché il modulo entra in azione e reindirizza prima che la riscrittura abbia la possibilità di risolverlo. – m59

+0

@ m59 Penso che il motivo per cui sei stato reindirizzato in seguito è perché il browser ha memorizzato nella cache la risposta 301, quindi è stato reindirizzato automaticamente all'URL con barra finale. Dovresti provare in curl o un browser nuovo –