Problèmes de variables htacces 2

Nov 26 2020

AVANT d' installer SSL, les choses fonctionnaient parfaitement !! Voici le code que j'ai dans le fichier .htaccess de mon serveur Web racine:

Options +MultiViews
RewriteEngine On
RewriteCond %{HTTP_HOST} andrea\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://andrea.com/$1 [R,L]

RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule (.*) $1.php [L]

Cela fonctionne et il fait exactement ce que je veux qu'il fasse. Donc si je vais par exemple:

www.andrea.com/account

il accède à "www.andrea.com/account.php". C'est ce que je veux. J'ai cependant un dossier à la racine appelé "produits". Il y a un autre fichier ".htaccess" dans ce dossier et je ne sais pas lequel de ces 2 doit être changé pour que la chose suivante fonctionne.

Lorsque vous accédez à cette URL: http: ____ / products / view / Hello / Goodbye

Je veux qu'il accède à "view.php" dans le dossier 'products' et dans ce fichier php, je pourrais le faire:

$id = $_GET["id"];    //      This would have "Hello"
$cat = $_GET["cat"];    //   This would have "Goodbye"

Et cela fonctionne bien lorsque j'utilise cet htaccess dans le dossier "produits":

RewriteEngine on
RewriteCond %{HTTP_HOST} !^$ RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteCond %{HTTPS}s ^on(s)| RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)/?(.*)$ /products/view.php?id=$1&cat=$2

Le problème avec ce code ci-dessus est, si je vais à: http: ____ / products / Hello / Goodbye

Je veux qu'il accède au "index.php" qui se trouve dans le dossier "produits". Mais à la place, il va à "view.php" à la place !! C'est comme si le code htaccess ci-dessus obligeait tout à aller à view.php (ce qui ne devrait être fait que si j'ai le "view / ____" dans l'url. Je veux que l'url ci-dessus aille à "index.php" dans les "produits" "et dans ce fichier, je devrais pouvoir accéder aux variables ID et CAT.

Avez-vous des idées sur ce qu'il faut changer dans mon fichier .htaccess? Désolé j'ai passé plus de 2 heures Je ne comprends pas une seule ligne en bas de mon code mais ça ne marche pas: /

Réponses

1 AmitVerma Nov 26 2020 at 11:35

Vous pouvez utiliser la règle suivante pour réécrire /products/Hello/Goodbyeà /products/index.php.

RewriteRule ^Hello/GoodBye/?$ /product/index.php?id=hello&cat=Goodbye  [L,NC]

Voici votre complet /product/.htaccess.

RewriteEngine on
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
#rewrite /products/Hello/GoodBye to /products/index.php
RewriteRule ^Hello/GoodBye/?$ /products/index.php?id=Hello&cat=Goodbye [L,NC] ################### RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)/?(.*)$ /products/view.php?id=$1&cat=$2
1 MrWhite Nov 27 2020 at 07:13
 Options +MultiViews

Tout d'abord, vous devez désactiver MultiViews. Dans ma réponse à votre question précédente , ma suggestion d'utiliser MultiViews était strictement une méthode "alternative" dans le contexte de votre question. Vous ne pouvez pas utiliser les deux méthodes (mod_rewrite et MultiViews) pour travailler avec des URL sans extension. Et puisque vous voulez maintenant faire plus de choses et passer des paramètres, MultiViews ne créera que des conflits. (MultiViews "gagnera" probablement et aucun paramètre n'est passé.)

De plus, avez-vous spécifiquement besoin du .htaccessfichier supplémentaire dans le /productssous-répertoire? Il sera (sans doute) plus facile d'avoir un seul .htaccessfichier à la racine du document. Cela évitera d'avoir à répéter la redirection HTTP vers HTTPS (bien que vous n'ayez pas réellement inclus une redirection HTTP vers HTTPS dans le .htaccessfichier de sous-répertoire ?).

# /products/.htaccess
RewriteRule ^([^/]*)/?(.*)$ /products/view.php?id=$1&cat=$2

Cette directive correspond à la fois view/Hello/Goodbye et Hello/Goodbye , ce qui explique pourquoi tout est écrit dans votre view.phpscript. Cependant, il ne fait pas non plus ce que vous dites - ce qui est déroutant. Si vous demandez, /products/view/Hello/Goodbyeil réécrira la demande dans /products/view.php?id=view&cat=Hello/Goodbye- ce qui n'est pas l'intention (sauf si MutliViews est activé, auquel cas aucun paramètre ne sera transmis).

Vous devez réellement vérifier viewsle chemin d'URL demandé avant d'essayer de réécrire views.php. Et si viewsn'est pas présent, réécrivez à la index.phpplace. Ce "branchement conditionnel" peut être obtenu en organisant simplement les directives dans l'ordre des règles "plus spécifiques" en premier.

Par exemple, dans votre .htaccessfichier racine , essayez ce qui suit. (Et supprimez /products/.htaccesscomplètement le fichier.)

# Ensure that MultiViews is disabled
Options -MultiViews

RewriteEngine On

# HTTP to HTTPS canonical redirect
RewriteCond %{HTTP_HOST} example\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://example.com/$1 [R=301,L]

# Abort early if the request already maps to (or looks like) a file or directory
RewriteCond %{REQUEST_URI} \.\w{2,4}$ [OR] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] # 1. Rewrite "/products/view/<id>/<cat>" to "/products/view.php?id=<id>&cat=<cat> RewriteRule ^(products/view)/([^/]*)/?(.*) $1.php?id=$2&cat=$3 [L]

# 2. Rewrite "/products/<id>/<cat>" to "/products/index.php?id=<id>&cat=<cat>
RewriteRule ^(products)/([^/]*)/?(.*) $1/index.php?id=$2&cat=$3 [L] # 3. Extensionless URLs for other requests RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule (.*) $1.php [L]

L'ordre des 3 règles ci-dessus est important. La règle la plus spécifique est la première. Incluant l' Lindicateur pour empêcher un traitement supplémentaire (inutile).

Notez que, selon vos directives d'origine, pour une demande du formulaire /products/view/Hello/Goodbye(ou /products/Hello/Goodbye), la Hello/Goodbyepartie est entièrement facultative et entraînera naturellement la définition des paramètres d'URL idet cat, mais vides.

De plus, selon vos directives d'origine, une demande du formulaire /products/view/Hello/Goodbye/foo/bar/bazentraînera la catdéfinition du paramètre URL sur Goodbye/foo/bar/baz(tout ce qui suit le segment de chemin initial).

Vous n'avez pas nécessairement besoin de vérifier qu'une requête correspond à un fichier ou à un répertoire (ce qui est relativement coûteux ) si vous rendez votre regex plus spécifique et ne correspondez qu'à ce que vous devez faire correspondre. Par exemple, votre regex /([^/]*)/?(.*)correspond actuellement à presque tout . Mais si vos variables <id>et <cat>ne peuvent être constituées que de lettres minuscules (par exemple), cela pourrait éviter d'avoir à vérifier le système de fichiers.

Autres notes:

  • Avez-vous besoin de vérifier le nom d'hôte dans la redirection HTTP vers HTTPS? Hébergez-vous plusieurs domaines? Sinon, la condition qui vérifie la HTTP_HOSTvariable serveur n'est pas requise.