URL conviviale pour des requêtes multiples et longues

J’ai essayé quelques questions différentes:

  1. php – .htaccess rend les URL conviviales pour des parameters multiples et dynamics
  2. .htaccess pour une URL conviviale avec plusieurs variables
  3. URL conviviales au lieu de chaînes de requête?

Les questions ci-dessus n’étaient pas utiles, alors j’ai commencé à développer une alternative, mais mon code retourne une erreur 404 avec plusieurs requêtes ( code1 ), et avec une requête a bien fonctionné ( code2 ) Donc:

( code1 ) – Ne fonctionne pas – Demande multiple ( code2 ) – Bon travail – Demande unique

Code1


     Options + FollowSymLinks - MultiViews
     RewriteEngine on
     RewriteCond% {REQUEST_FILENAME}! -F
     RewriteCond% {REQUEST_FILENAME}! -D
     RewriteRule ^ ([^ /] *) / ([^ /] *) / ([^ /] *) / ([^ /] *) / ([^ /] *) / ([^ /] *) $ /~loja/index.php?a=$1&genero=$2&material=$3&cor=$4&tamanho=$5&Ordenacao=$6 [NC, L, QSA]
     RewriteCond% {THE_REQUEST} ^. * / Index \ .php 
     RewriteRule ^ (. *) Index.php $ / ~ loja / $ 1 / $ 2 / $ 3 / $ 4 / $ 5 / $ 6 [R = 301, L]  
     DirectoryIndex index.php

Maintenant, voyez le code correct:

Code2


     Options + FollowSymLinks - MultiViews
     RewriteEngine on
     RewriteCond% {REQUEST_FILENAME}! -F
     RewriteCond% {REQUEST_FILENAME}! -D
     RewriteRule ^ ([a-zA-Z0-9 _-] +) $ /~loja/index.php?a=$1 [NC, L, QSA]
     RewriteCond% {THE_REQUEST} ^. * / Index \ .php 
     RewriteRule ^ (. *) Index.php $ / ~ loja / $ 1 [R = 301, L]  
     DirectoryIndex index.php

Quel est le problème avec ( code1 )?

Le premier ensemble de règles ne fonctionne pas car l’URL de l’ objective contient 7 segments, mais le RewriteRule correspond à 6 segments. Si vous ajoutez un autre /([^/]*) avant le $ dans le RewriteRule , cela fonctionnera.

Donc, ce serait:

 RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /~loja/index.php?a=$1&genero=$2&material=$3&cor=$4&tamanho=$5&Ordenacao=$6 [NC,L,QSA] 

Vous pouvez rendre un segment / caractère facultatif en ajoutant un ? personnage à la fin de celui-ci.

La deuxième partie du premier ensemble de règles est complètement fausse et ne sert à rien. Tout d’abord, notez que la variable THE_REQUEST contient la ligne de requête HTTP complète, comme l’ indique la documentation :

THE_REQUEST contient la ligne de requête HTTP complète envoyée par le navigateur au serveur (par exemple, GET /index.html HTTP/1.1 ). Cela n’inclut pas les en-têtes supplémentaires envoyés par le navigateur. Cette valeur n’a pas été décodée, contrairement à la plupart des autres variables ci-dessous.

Vous ne voulez pas l’utiliser, utilisez plutôt REQUEST_URI .

Le 404

La raison pour laquelle vous obtenez cette erreur 404 est que, parce que RewriteRule ne correspond pas à l’URI de la requête, l’URL n’est pas réécrite dans index.php. Cette hiérarchie de répertoires n’existe pas sur le système de fichiers, donc le 404.

Segments d’URI facultatifs

Votre ensemble de règles d’origine attendait le décompte exact des arguments URI. Si vous avez besoin d’être plus flexible à ce sujet, vous pouvez essayer ce jeu de règles qui accepte 1 à 7 segments et les associer à des chaînes de requête:

  RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !index\.php RewriteRule ^([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)$ /~loja/index.php?a=$1&genero=$2&material=$3&cor=$4&tamanho=$5&Ordenacao=$6 [NC,L,QSA]  

Lorsque vous testez cela, notez les chaînes de requête vides. Du côté de PHP, vous devez utiliser empty() au lieu de isset() pour voir si la chaîne de requête existe. Comme ils sont toujours réglés, mais vides.

Hors admin/

Afin d’exclure ces règles pour qu’elles soient appliquées au chemin d’ admin/ , vous pouvez mettre à jour le RewriteCond ci-dessus comme ceci:

 RewriteCond %{REQUEST_URI} !(index\.php|admin)