2012-01-11 9 views
12

Diversi giorni fa ho avuto una domanda sulla rimozione di index.php dalla barra degli indirizzi, quindi l'indirizzo della pagina sembra più breve e migliore. La soluzione più breve di questo problema era (RewriteRule ^index.php/[L,R=301] in the .htaccess file). E funziona!Sembra che i valori POST vengano persi quando si utilizza .htaccess RewriteRule. I valori GET sono OK. Come risolvere?

Da quando ho inserito quella stringa nel .htaccess, alcune pagine sono reindirizzate alla pagina principale. Ho speso un sacco di tempo per indovinare, perché. Come ho capito, la risposta è: con RewriteRule ^index.php/[L,R=301], i parametri $ _POST non vengono inviati alla pagina successiva. I parametri $ _GET sono OK. Dopo aver rimosso RewriteRule ^index.php/[L,R=301] da .htaccess, tutto diventa come al solito. Perché succede e come risolverlo?

Grazie.

+1

avuto lo stesso problema con solo [L] bandiera. Questo si è verificato quando si cambia hosting, quindi credo che questo sia, in qualche modo, correlato alla configurazione. – Tsadiq

+0

Ecco un link valido per [P] flag :) http://stackoverflow.com/questions/358263/htaccess-is-it-possible-to-redirect-post-data – Tsadiq

risposta

18

Il flag [R] incorre in un reindirizzamento. E gli user-agent emettono un reindirizzamento come richiesta GET. Non c'è nulla che possa essere fatto se si vuole davvero ridurre gli URL fino al percorso root /.

Si potrebbe tuttavia bloccare le richieste POST espressamente di essere riscritto/reindirizzato:

RewriteCond %{REQUEST_METHOD} !POST 
RewriteRule ^index.php/[L,R=301] 
4

I valori POST non sopravviveranno MAI a un reindirizzamento esterno (R=301), è una responsabilità di sicurezza, quindi i browser non lo supporteranno mai. Rimuovi il R=301 e starai bene. Dovresti solo modificare tutti i collegamenti esistenti alla pagina più breve/più bella (<a> ma anche creare azioni, ecc.)

+1

[R = 301] interromperà le richieste POST (i dati del modulo sono persi), ma lasciarlo non influenzerà la barra degli indirizzi. Per questo motivo, si vorrebbe evitare di fare questo tipo di riscrittura se (mai) POST di indicizzare. – Umbrella

+2

Sì. Si potrebbe sempre aggiungere un 'RewriteCond% {REQUEST_METHOD}!POST' prima della riscrittura, ma esita a pensare _che qualsiasi modulo abbia ancora index.php come azione_ ... – Wrikken

+0

In effetti. Sarebbe una buona domanda per l'OP. – Umbrella

5

sto usando qualcosa come:

<IfModule mod_rewrite.c> 

RewriteEngine on 

RewriteCond %{REQUEST_URI} !^/(css|images|js)/ 

# don't rewrite existing files, directories and links 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-l 


# rewrite everything else to index.php 

RewriteRule .* index.php [L] 

</IfModule> 

e il suo funzionamento per tutte le richieste, la riscrittura tramite indice. file php. Se è necessario reindirizzare 301 (che sta per in modo permanente il codice Mosso) verificare questa domanda: Is it possible to redirect post data?

+0

Sembra una sostituzione alla gestione 404 esistente di Apache. Più precisamente, questo non sembra rispondere alla domanda. – Umbrella

10

Si potrebbe provare a utilizzare [L,R=307] invece. 307 non si deve cambiare la richiesta-metodo secondo le specifiche, ma io non so come il browser implementato 307.

Ma la radice del problema è l'uso di <form action="____/index.php" ...

Basta lasciare l'azione vuoto per POST all'URL attuale es

1

ho avuto gli stessi problemi, ma i miei htacces era come questo:

RewriteEngine on 
RewriteRule .* index.php [NC] 

Basta cambiare NC per L e tutto funziona bene.

codice finale:

RewriteEngine on 
RewriteRule .* index.php [L] 
Problemi correlati