J’ai essayé quelques questions différentes:
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
.
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.
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.
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)