2009-06-26 13 views
1

Ich habe Links wie diese, die ich ändern will:Hilfe mit regulärem Ausdruck mit mod_rewrite

mypage.com?page=missions&id=5 
mypage.com?page=hello 

Ich habe versucht, sie in einfache Links mit, dies zu ändern:

Options +FollowSymLinks 
RewriteEngine On 
RewriteRule ^([^/]*)/([^/]*)$ /index.php?page=$1&id=$2 [L] 

Es funktioniert, aber wenn ich zugreifen möchten Seiten wie (mypage.com?page=hello) ich schreiben müssen:

mypage.com/hello/ 

und wenn ich ohne den Schrägstrich am Ende schreiben wie dies

mypage.com/hello 

es funktioniert nicht.

Wie behebe ich es? :)

Antwort

0

ich über den Schrägstrich mit SEO gelesen (! Wusste nicht darüber, danke mathew) und das Endergebnis war:

RewriteRule ^([a-zA-Z0-9_-]+)/$ /index.php?page=$1 [L] 
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/$ /index.php?page=$1&id=$2 [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$ 
RewriteRule (.*)$ http://www.mypage.com/$1/ [R=301,L] 

So jetzt habe ich es zwingen, einen Schrägstrich zu haben.

3

Dies sollte funktionieren:

RewriteRule ^([^/]*)(/([^/]*))?$ /index.php?page=$1&id=$3 [L] 

Dies wird der Schrägstrich optional machen, indem es in einer optionalen Gruppe einschließlich (durch (...)?), zusammen mit der optionalen zweiten Hälfte des Abfrage-String. Da dies eine neue Gruppe zwischen der ersten und der zweiten einführt (die linke Klammer bestimmt die Reihenfolge), müssen wir die zweite Rückwärtsreferenz von $2 zu $3 ändern.

Wenn die Logik viel komplexer wird, kann es einfacher sein, die Regeln aufzuteilen.

+0

Ich verstehe es und es scheint alles sehr logisch, aber es funktioniert nicht. Und ich verstehe nicht warum. Ich bin nicht sehr erfahren mit regulären Ausdrücken, Mod-Rewrite und .htaccess ... Hm –

1

Sie könnten eine zweite Regel hinzufügen, die den zweiten Parameter und optional den slash auslässt:

RewriteRule ^([^/]+)/?$ /index.php?page=$1 
RewriteRule ^([^/]+)/(\d+)/?$ /index.php?page=$1&id=$2 

Dies könnte auch funktionieren:

RewriteRule ^([^/]+)(?:/(\d+))?/?$ /index.php?page=$1&id=$2 

für SEO, werden Sie wahrscheinlich Anfragen umleiten möchten den Schrägstrich an der gleichen Adresse mit einem Schrägstrich fehlt. Verwenden Sie RedirectMatch dafür.

+0

Ich habe das auch versucht, und es funktioniert nicht. Nicht einmal der erste Code, den du gepostet hast. RewriteRule^([^ /] +) /? $ /index.php?page=$1 Es funktioniert nur, wenn ich es schreibe, dass es am Ende einen Schrägstrich haben muss: RewriteRule^([^ /] +)/$ /index.php?page=$1 Wirklich seltsam. Ich werde etwas mehr versuchen und es hier posten ... –

+0

Nun, es sollte nicht funktionieren. sollte ein * anstelle von a + hm sein. Oder? –

+0

Aber es funktioniert nicht mit * entweder –

Verwandte Themen