2009-08-17 9 views
0

Ich versuche, mit mod_rewrite URLs von einer URL von einem alten Host zu einem neuen URL mit einem anderen URL-Format umzuleiten. Der neue Host Null-Pads die ID zu sechs Ziffern wie folgt:Kann ich mod_rewrite verwenden, um auf eine URL mit einem gepolsterten Parameter umzuleiten?

Alte URL:

http://www.example.com/script.cgi?page_id=123

Needs umleiten zu:

http://archive.example.com/000123/

Das ist, was ich habe so weit:

RewriteCond %{QUERY_STRING} ^page_id=([0-9]+)$ 
RewriteRule ^script\.cgi http://archive.example.com/%1/? [R=301,L] 

Dies ist Umleitungen an:

http://archive.example.com/123/

Gibt es einen Weg, um die Null-Polsterung mit mod_rewrite zu erreichen oder muss ich nur einen Handler-Skript schreiben, um die richtige URL zu umleiten?

+0

Dies sieht aus wie es auf Serverfault sein sollte. –

Antwort

2

Hier sind zwei weitere elegante Lösungen:

  1. N flag Mit einem Null zu einem Zeitpunkt hinzuzufügen, bis wir sechs Ziffern haben:

    RewriteCond %{QUERY_STRING} ^(([^&]*&)*)page_id=([0-9]{1,5})(&.*)?$ 
    RewriteRule ^script\.cgi$ $0?page_id=0%3 [N] 
    RewriteCond %{QUERY_STRING} ^([^&]*&)*page_id=([0-9]{6})(&.*)?$ 
    RewriteRule ^script\.cgi$ http://archive.example.com/%2/? [R=301,L] 
    
  2. eine zusätzliche RewriteCond Mit fünf Nullen vorangestellt wird und dann erhalten Sie nur die letzten sechs Ziffern:

    RewriteCond %{QUERY_STRING} ^(([^&]*&)*)page_id=([0-9]+)(&.*)?$ 
    RewriteCond 00000%3 [0-9]{6}$ 
    RewriteRule ^script\.cgi$ http://archive.example.com/%0/? [R=301,L] 
    

Das komplexe Muster, das auf QUERY_STRING angewendet wird, dient nur dazu, zusätzliche URL-Parameter zu berücksichtigen. Und ich bevorzuge die zweite Lösung, da es nur eine Regel und umfassender ist.

2

keine elegante Lösung, aber Sie können sechs verschiedene Regeln einrichten:

RewriteCond %{QUERY_STRING} ^page_id=([0-9]{1})$ 
RewriteRule ^script\.cgi http://archive.example.com/00000%1/? [R=301,L] 

RewriteCond %{QUERY_STRING} ^page_id=([0-9]{2})$ 
RewriteRule ^script\.cgi http://archive.example.com/0000%1/? [R=301,L] 

RewriteCond %{QUERY_STRING} ^page_id=([0-9]{3})$ 
RewriteRule ^script\.cgi http://archive.example.com/000%1/? [R=301,L] 

RewriteCond %{QUERY_STRING} ^page_id=([0-9]{4})$ 
RewriteRule ^script\.cgi http://archive.example.com/00%1/? [R=301,L] 

RewriteCond %{QUERY_STRING} ^page_id=([0-9]{5})$ 
RewriteRule ^script\.cgi http://archive.example.com/0%1/? [R=301,L] 

RewriteCond %{QUERY_STRING} ^page_id=([0-9]+)$ 
RewriteRule ^script\.cgi http://archive.example.com/%1/? [R=301,L] 
+0

Beat mich dazu! Ich denke, das wird wahrscheinlich der einzige Weg sein. Zumindest sind es nur sechs Ziffern. –

0

Ok, ich erkannte ich die Ergebnisse erzielen konnte ich mit folgendem gesucht:

RewriteCond %{QUERY_STRING} ^page_id=([0-9]{1})$ 
RewriteRule ^script\.cgi http://archive.example.com/00000%1/? [R=301,L] 

RewriteCond %{QUERY_STRING} ^page_id=([0-9]{2})$ 
RewriteRule ^script\.cgi http://archive.example.com/0000%1/? [R=301,L] 

RewriteCond %{QUERY_STRING} ^page_id=([0-9]{3})$ 
RewriteRule ^script\.cgi http://archive.example.com/0000%1/? [R=301,L] 

RewriteCond %{QUERY_STRING} ^page_id=([0-9]{4})$ 
RewriteRule ^script\.cgi http://archive.example.com/00%1/? [R=301,L] 

RewriteCond %{QUERY_STRING} ^page_id=([0-9]{5})$ 
RewriteRule ^script\.cgi http://archive.example.com/0%1/? [R=301,L] 

RewriteCond %{QUERY_STRING} ^page_id=([0-9]{6})$ 
RewriteRule ^script\.cgi http://archive.example.com/%1/? [R=301,L] 

Gibt es eine andere Möglichkeit, dies ohne die multiplen Regeln zu tun?

+3

Also StackOverflow hat das neue Telepathie-Plugin installiert :) – Zed

1

Die andere Option besteht darin, eine RewriteMap zu verwenden und ein Skript zu generieren, um die URL zu umleiten.

RewriteMap zeropad prg:/usr/local/zeropad.pl 

RewriteCond %{QUERY_STRING} ^page_id=([0-9]+)$ 
RewriteRule ^script\.cgi ${zeropad:%1} [R=301,L] 

Und /usr/local/zeropad.pl ist ein ausführbares Skript so etwas wie

#!/usr/bin/perl 
$| = 1; #We don't want buffering 
while (<STDIN>) { 
    printf("http://archive.example.com/%06d/?\n",$_); 
} 

Sie verwenden können, enthält, was ausführbare Sie anstelle eines Perl ein mögen. Die Idee ist es, die URL (mit einem abschließenden Zeilenumbruch) auszudrucken. Es muss in einer Schleife arbeiten, in der STDIN gelesen wird, da Apache das Skript einmal startet und dieselbe Instanz wiederholt aufruft. Es kann seine Ausgabe nicht puffern, da Apache auf seine Ausgabe wartet (bis zu einer neuen Zeile), bevor das Neuschreiben abgeschlossen wird.

Verwandte Themen