2016-06-21 20 views
1

Ich benutze diese .htaccess RewriteRule:rekursive .htaccess Rewrite-Regel

RewriteRule ^([a-z]{2}|[a-z]{2}\-[A-Z]{2})/?$ /index.php?lang=$1 [L] 
RewriteRule ^([a-z]{2}|[a-z]{2}\-[A-Z]{2})/([^/]*)/?$ /index.php?lang=$1&controller=$2 [L] 
RewriteRule ^([a-z]{2}|[a-z]{2}\-[A-Z]{2})/([^/]*)/([^/]*)/?$ /index.php?lang=$1&controller=$2&p1=$3 [L] 
RewriteRule ^([a-z]{2}|[a-z]{2}\-[A-Z]{2})/([^/]*)/([^/]*)/([^/]*)/?$ /index.php?lang=$1&controller=$2&p1=$3&p2=$4 [L] 
RewriteRule ^([a-z]{2}|[a-z]{2}\-[A-Z]{2})/([^/]*)/([^/]*)/([^/]*)/([^/]*)/?$ /index.php?lang=$1&controller=$2&p1=$3&p2=$4&p3=$5 [L] 
RewriteRule ^([a-z]{2}|[a-z]{2}\-[A-Z]{2})/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/?$ /index.php?lang=$1&controller=$2&p1=$3&p2=$4&p3=$5&p4=$6 [L] 
RewriteRule ^([a-z]{2}|[a-z]{2}\-[A-Z]{2})/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/?$ /index.php?lang=$1&controller=$2&p1=$3&p2=$4&p3=$5&p4=$6&p5=$7 [L] 

Wie Sie sehen können, die Logik ist, dass der erste Parameter Sprache formatiert (dh: en oder en-US), der zweite Parameter a die Steuerung und der Rest sind Parameter mit dem Namen 'p' concat n, wobei n ist die Bestellnummer des Parameters (p1/p2/p3).

Jetzt möchte ich etwas wie folgt hinzuzufügen:

RewriteRule ^([a-zA-Z0-9]{3,})/?$ /index.php?defaultcontroller=true&p1=$1 [L] 
RewriteRule ^([a-zA-Z0-9]{3,})/([^/]*)/?$ /index.php?defaultcontroller=true&p1=$1&p2=$2 [L] 
// And so on ... 

Dies versucht, dass wenn der erste Parameter nicht Sprache formatiert wird, die Steuerung ist ein Standard-Controller und der erste Parameter p1, die zweite ist p2 und so weiter. Das hat aber drei Probleme:

  • ([a-zA-Z0-9]{3,}) keine Negation von ([a-z]{2}|[a-z]{2}\-[A-Z]{2}) ist. URLs wie http://example.com/e oder http://example.com/3n stimmen mit keinem Muster überein (sie sollten mit dem zweiten übereinstimmen).
  • Ich werde mit mehr als 10 Zeilen enden.
  • Ich habe eine Begrenzung der Parameter. http://example.com/es-US/controller/p1/p2/p3/p4/p5/p6 wird keinem Muster entsprechen.

Also, bitte, könnten Sie mir helfen diese nur zwei Zeilen (eine für den ersten Parameter auf eine Sprache mit (Art) rekursiven Code zu reduzieren, ist formated und eine für den ersten Parameter nicht-laguage formatiertem)

Antwort

1

Sie können die folgenden 1-Liner verwenden:

RewriteRule ^(en|en-US)/?([^/]*)/?([^/]*)/?([^/]*)/?([^]*)/([^/]*)/?([^/]*)/?$ /index.php?lang=$1&controller=$2&p1=$3&p2=$4&p3=$5&p4=$6&p5=$7 [L] 
+0

Ich denke, das optional die Parameter macht. Nett. Ich kann nicht '(en | en-US)' verwenden, aber die '([az] {2} | [az] {2} \ - [AZ] {2})' weil ich viele Sprachen akzeptieren muss Codes. Weißt du auch, wie man negiert? ([A-z] {2} | [a-z] {2} \ - [A-Z] {2}) '? –