2009-08-11 12 views
17

Ho creato un nuovo sito PHP per un cliente e desidero reindirizzare i risultati di Google in cima alla classifica della vecchia struttura del sito a quella nuova.Apache Redirect 301 ha esito negativo quando si utilizzano i parametri GET, ad esempio? Blah =

Ho messo diverse dozzine di Redirect 301 in un .htaccess nel documentroot, e mentre alcuni funzionano bene sto avendo problemi con un gruppo di altri.

Questo funziona bene:

Redirect 301 /nl/flash/banner_new.swf http://www.example.com/actueel/nieuws.html?action=show&f_id=152 

Questo non funziona! (Portando ad una 404 in quanto il reindirizzamento viene semplicemente saltato):

Redirect 301 /nl/index.php?mID=24511&subID=0 http://www.example.com/solutions/printsolutions.html 
Redirect 301 /nl/index.php?mID=24512&subID=0 http://www.example.com/support/koppeling-met-omgeving.html 

I redirect sono mescolati nel file .htaccess, e solo il redirect con parametri GET sembrano fallire.

C'è una soluzione? Ignorare i reindirizzamenti non riusciti non è un'opzione per il cliente. Grazie per i tuoi pensieri.

risposta

15

Mentre Gumbo's answer's ragionamento era corretto, non ho potuto ottenere il suo RewriteRule al lavoro.

L'aggiunta di un altro RewriteCond lo ha fatto. Quanto segue è stato testato e funziona correttamente.

RewriteCond %{REQUEST_URI} /nl/index.php$ 
RewriteCond %{QUERY_STRING} ^mID=24511&subID=0$ 
RewriteRule ^.*$ http://www.example.com/solutions/printsolutions.html [L,R=301] 
+2

Il pattern effettivo per 'RewriteRule' dipende da se è utilizzato nella configurazione del server o in un file .htaccess e dove si trova il file .htaccess. – Gumbo

12

Redirect FUNZIONA solo sui percorsi URL:

Il vecchio URL-path è un percorso tra maiuscole e minuscole (% -decoded) che inizia con una barra. [...]

Quindi la query URL (la parte dopo la prima ? fino al primo # dopo) non è controllato.

Ma è possibile utilizzare mod_rewrite per farlo:

RewriteCond %{QUERY_STRING} ^mID=24511&subID=0$ 
RewriteRule ^nl/index\.php$ http://www.example.com/solutions/printsolutions.html [L,R=301] 
RewriteCond %{QUERY_STRING} ^mID=24512&subID=0$ 
RewriteRule ^nl/index\.php$ http://www.example.com/support/koppeling-met-omgeving.html [L,R=301] 
12

In accordo con entrambi Gumbo e di risposte di Martijn ... ma:

errore di battitura nel Martijn di, ci dovrebbe essere essere "^" per avviare l'espressione regolare per la condizione REQUEST_URI:

RewriteCond %{REQUEST_URI} ^/nl/index.php$ 

Anch'io riuscivo a far funzionare Martijn, non Gumbo, dove era il mio file .htaccess.

Inoltre, se non si desidera che la stringa di parametri venga passata con la riscrittura, è necessario aggiungere un "?" sulla fine dell'URL:

RewriteRule ^.*$ http://www.example.com/solutions/printsolutions.html? [L,R=301] 

In caso contrario, seguente codice di Martijn, si legge "se l'URL è /nl/index.php?mID=24511 & subid = 0 quindi reindirizzare ad http://www.example.com/solutions/printsolutions.html?mID=24511&subID=0 con un redirect permanente 301 intestazione e non elaborare più regole su questo URL "

Questo può o non può essere quello che vuoi, e per essere equo come regola generale se i parametri non sono compresi saranno semplicemente ignorati senza fare alcun danno, quindi probabilmente non importa.Tuttavia, se desideri reindirizzare un essere umano a una nuova pagina e desideri "URL carini", è preferibile rimuovere la stringa dei parametri, quindi attaccare "?" alla fine dell'URL di destinazione.

+0

Grande interesse per come sopprimere il parametro predefinito Parametro GET passare con "?" firmare alla fine ... lo stavo cercando. –

+1

il? il commento è una grande aggiunta a questo post. –

Problemi correlati