Problèmes de variables htacces 2
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
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
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 .htaccess
fichier supplémentaire dans le /products
sous-répertoire? Il sera (sans doute) plus facile d'avoir un seul .htaccess
fichier à 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 .htaccess
fichier 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.php
script. Cependant, il ne fait pas non plus ce que vous dites - ce qui est déroutant. Si vous demandez, /products/view/Hello/Goodbye
il 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 views
le chemin d'URL demandé avant d'essayer de réécrire views.php
. Et si views
n'est pas présent, réécrivez à la index.php
place. 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 .htaccess
fichier racine , essayez ce qui suit. (Et supprimez /products/.htaccess
complè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' L
indicateur 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/Goodbye
partie est entièrement facultative et entraînera naturellement la définition des paramètres d'URL id
et cat
, mais vides.
De plus, selon vos directives d'origine, une demande du formulaire /products/view/Hello/Goodbye/foo/bar/baz
entraînera la cat
dé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_HOST
variable serveur n'est pas requise.