2009-08-11 14 views
17

Zbudowałem nową witrynę PHP dla klienta i chcę przekierować najlepsze wyniki Google ze starej struktury witryny do nowej.Przekierowanie Apache 301 kończy się niepowodzeniem, gdy używane są parametry GET, takie jak? Blah =

Umieściłem kilkadziesiąt przekierowań 301 w pliku .htaccess w pakiecie dokumentów, a podczas gdy niektóre działają dobrze, mam problemy z grupą innych.

Działa to dobrze:

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

To nie działa! (Prowadząc do 404 od przekierowanie jest po prostu pomijane):

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 

przekierowania są mieszane w pliku .htaccess i tylko przekierowania z parametrami GET wydają się niepowodzeniem.

Czy istnieje obejście? Ignorowanie nieudanych przekierowań nie jest opcją dla klienta. Dzięki za twoje myśli.

Odpowiedz

15

Podczas Gumbo's answer's rozumowanie było poprawne, nie mogłem dostać jego RewriteRule do pracy.

Zrobiłem inny RewriteCond zrobił to. Poniższe zostały przetestowane i działają dobrze.

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

Rzeczywisty wzorzec 'RewriteRule' zależy od tego, czy jest używany w konfiguracji serwera, czy w pliku .htaccess i gdzie znajduje się plik .htaccess. – Gumbo

12

Redirect działa tylko na ścieżkach URL:

Stary ścieżka_url jest wielkość liter (% -decoded) ścieżka rozpoczynająca się ukośnik. [...]

Więc zapytania URL (część po pierwszej ? do pierwszego # po) nie jest zaznaczona.

Ale można użyć mod_rewrite to zrobić:

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

Zgadzając się z zarówno Gumbo i odpowiedzi Martijn ... ale:

Typo w Martijn'S, nie powinno być być "^", aby rozpocząć regularne wyrażenie warunku REQUEST_URI:

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

Ja też mogłem tylko załadować Martijna, a nie Gumbo, do pracy tam, gdzie znajdował się mój plik .htaccess.

Ponadto, jeśli nie chcesz, aby ciąg parametrów został przekazany z przepisem, dodaj "?" na końcu adresu URL:

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

inaczej, poniższy kod Martijn jest, że czyta „, czy adres URL jest /nl/index.php?mID=24511 & subid = 0 Then przekierować do http://www.example.com/solutions/printsolutions.html?mID=24511&subID=0 z 301 Stałe przekierowanie nagłówek i nie przetwarzaj więcej reguł pod tym adresem URL "

To może być lub nie być, co chcesz, i aby być sprawiedliwym z zasady, jeśli parametry nie są zrozumiałe, zostaną po prostu zignorowane bez żadnej szkody, więc to prawdopodobnie nie będzie miało znaczenia.Jeśli jednak chcesz przekierować człowieka na nową stronę i chcesz uzyskać "ładne adresy URL", lepiej jest usunąć ciąg parametrów, więc wstaw "?" na końcu docelowego adresu URL.

+0

Doskonałe przypomnienie, jak pominąć domyślny parametr parametru GET z parametrem "?" znak na końcu ... szukał tego. –

+1

the? Komentarz jest świetnym dodatkiem do tego postu. –

Powiązane problemy