Question

Je construis un site Web assez volumineux et mon .htaccess commence à se sentir un peu gonflé. Existe-t-il un moyen de remplacer mon système actuel de - une règle pour chacun des nombres possibles de vars pouvant être passés, une capture toute expression qui peut représenter un nombre variable d'entrées?

par exemple, j'ai actuellement:

RewriteRule ^([a-z]+)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /index.php?mode=$1&id=$2&$3=$4&$5=$6
RewriteRule ^([a-z]+)/([^/]*)/([^/]*)/([^/]*)$ /index.php?mode=$1&id=$2&$3=$4
RewriteRule ^([a-z]+)/([^/]*)$ /index.php?mode=$1&id=$2
RewriteRule ^([a-z]+)$ /index.php?mode=$1

la première référence arrière est toujours le mode et (le cas échéant) la seconde est toujours id , toutes les autres références arrière alternant ensuite entre le nom de l'entrée et son valeur

http://www.example.com/search
http://www.example.com/search/3039/sort_by/name_asc/page/23

J'aimerais pouvoir avoir une seule expression pour gérer gracieusement toutes les entrées.

Était-ce utile?

La solution

Faites comme Drupal:

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

Et manipulez ensuite tout ce qui se trouve dans votre script en utilisant du code php comme ceci

$pathmap = ();
if (

Faites comme Drupal:

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

Et manipulez ensuite tout ce qui se trouve dans votre script en utilisant du code php comme ceci

<*>GET["q"]){ $path = split("/",

Faites comme Drupal:

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

Et manipulez ensuite tout ce qui se trouve dans votre script en utilisant du code php comme ceci

<*>GET["q"]); for ($i=0; $i+1<count($path); $i++){ $pathmap[$path[$i]] = $path[$i+1]; $i++; } }

Autres conseils

Je ne sais pas si cela peut être fait avec une seule expression, mais avec un nombre fixe d'expressions, quelle que soit la longueur de la chaîne de requête.

Vos règles mod_rewrite seront appelées à plusieurs reprises, vous donnant ce que l'on appelle parfois récursion mod_rewrite. Il existe des techniques pour l'éviter, mais je pense que vous voulez l'utiliser.

Configurez une règle qui remplace la dernière paire par name = value & <; p>

Continuez à fixer la chaîne de requête d'entrée à la sortie. À chaque fois, votre chaîne de requête s'allongera et votre URL sera plus courte.

Finalement, vous n'avez qu'une seule valeur qui correspond à votre dernière règle.

Vous devez capturer la chaîne de requête avec

RewriteCond %{QUERY_STRING} ^(.*)$

Et vous le rajoutez à la sortie avec% 1

Vous vous retrouveriez avec quatre lignes.

Je sais que vous avez commencé avec quatre lignes, mais vous pouvez faire correspondre autant de paramètres que vous le souhaitez sans avoir à ajouter une cinquième ligne.

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*/)([^/]+)/([^/]+) $1?$2=$3&%1 [L]
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^([^/]+)/ $1.php?%1 [L]

Ceci réécrira ce qui suit

/mypage/param1/val1/param2/val2/param3/val3/...     --->
/mypage.php?param1=val1&param2=val2&param3=val3&...

Il s’arrête s’il ne reste plus qu’un paramètre. Il faudra le premier " paramètre " et appelez le fichier .php portant ce nom. Il n'y a pas de limite au nombre de paires param / val.

Je ne crois pas que ce soit un moyen - mais je dirais que votre meilleur choix serait d'avoir le script "index.php". traiter un chemin au lieu d'avoir à faire autant de références en arrière.

Ainsi, par exemple, votre réécriture serait

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Ou similaire ... Ainsi, la variable $ _SERVER ['REQUEST_URI'] contiendra les informations sur le chemin, que vous pourrez fractionner et analyser.

$path = split('/', 

Je ne crois pas que ce soit un moyen - mais je dirais que votre meilleur choix serait d'avoir le script "index.php". traiter un chemin au lieu d'avoir à faire autant de références en arrière.

Ainsi, par exemple, votre réécriture serait

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Ou similaire ... Ainsi, la variable $ _SERVER ['REQUEST_URI'] contiendra les informations sur le chemin, que vous pourrez fractionner et analyser.

http://example.com/foo/bar/baz

Ceci finit avec $ mode contenant le mode et $ path contenant un tableau d'éléments constituant le reste de votre chemin, donc

<*>

Vous laisserait avec $ mode étant 'foo' et $ path étant un tableau contenant 'bar' et 'baz'

SERVER['REQUEST_URI']); array_shift($path); // We always have a first null value $mode = array_shift($path);

Ceci finit avec $ mode contenant le mode et $ path contenant un tableau d'éléments constituant le reste de votre chemin, donc

<*>

Vous laisserait avec $ mode étant 'foo' et $ path étant un tableau contenant 'bar' et 'baz'

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top