htaccess ne permet pas l'accès aux sous-répertoires avec des paramètres
P粉785905797
P粉785905797 2024-03-30 20:05:48
0
1
384

J'essaie de créer un htaccess pour les URL de référencement, j'ai créé un htaccess, toutes les URL fonctionnent correctement, sauf les sous-dossiers avec des paramètres, elles redirigent vers le dossier du site.

sitefolder est mon répertoire racine et tous mes fichiers sont là.

Exemple : L'URL devrait ressembler à ceci :

http://localhost/sitefolder/subcat/39/web-hosting
  http://localhost/sitefolder/profile/1/username

Dans htaccess, cela ressemble à ceci :

RewriteRule ^subcat/(.*)/([a-zA-Z0-9_-]+)$ subcat.php?q=&slug= [L,NC]
 RewriteRule ^profile/(.*)/([a-zA-Z0-9_-]+)$ show_profile.php?q=&slug= [L,NC]

Le premier paramètre est id et le deuxième paramètre est slug, mais aucune de ces deux URL n'ira à l'url.

Voici tout mon code htacces :

Options +FollowSymLinks -MultiViews
RewriteEngine on
RewriteRule ^contact-us contact-us.php [L,NC]
RewriteRule ^login login.php [L,NC]
RewriteRule ^register register.php [L,NC]
RewriteRule ^search search.php [L,NC]
RewriteRule ^about-us about-us.php [L,NC]
RewriteRule ^(.*)/([a-zA-Z0-9_-]+)$ detail.php?q=&slug= [L,NC]
RewriteRule ^cats categories.php [L,NC]
RewriteRule ^subcat/(.*)/([a-zA-Z0-9_-]+)$ subcat.php?q=&slug= [L,NC]
RewriteRule ^profile/(.*)/([a-zA-Z0-9_-]+)$ show_profile.php?q=&slug= [L,NC]

C'est ainsi que j'obtiens les paramètres subcat.php et je ne redirige pas vers l'index en cas d'erreur, donc je ne pense pas que ce soit à cause de php :

if(!empty($_GET['slug']) AND !empty($_GET['q'])) {
    $slug = $_GET['slug'];
    $pid = is_numeric($_GET['q']);
    $userQuery = $handler->getPosts("SELECT * FROM categories WHERE catId = ?", [$pid])->fetchAll();
   if($userQuery) {
      foreach($userQuery as $user){
         $catid = intval($user['catId']);
         $cat_title = htmlspecialchars($user['catName']);
         $cat_seo_url = htmlspecialchars($user['cat_seo_url']);
         $cat_descriptions = htmlspecialchars($user['cat_desc']);
         $cat_keywords = htmlspecialchars($user['cat_keys']);
         $cat_created = htmlspecialchars($user['cat_created_at']);
         $cat_img = htmlspecialchars($user['cat_img']);
      }

   }else{
      echo "Something went wrong while execute query.";
      exit();
   }
}else{
   echo "Something went wrong with parameters";
   exit();
}

P粉785905797
P粉785905797

répondre à tous(1)
P粉450079266

Si subcat.php 被调用(正如您在评论中所述),那么 .htaccess 不是问题。但是您发布的任何代码中都没有重定向到 index.php (ou tout type de redirection).

Cependant, il semble y avoir une erreur d'exécution avec cette ligne :

$pid = is_numeric($_GET['q']);
Quelle que soit la valeur de

is_numeric() 只是测试参数是否为数字并返回布尔值,它不会返回该变量的数字值,这正是您所期望的。因此,无论 q, votre SELECT échouera toujours (ou renverra le premier élément).

Vous pourriez avoir besoin de quelque chose comme ceci pour récupérer la valeur réelle d'un paramètre d'URL spécifié :

$pid = is_numeric($_GET['q']) ? (int)$_GET['q'] : 0;

Mais vous devez d'abord vérifier que ces paramètres d'URL (c'est-à-dire les variables $_GET) sont transmis, sinon votre script émettra un message E_NOTICE.


Mise à jour :

Conflits avec votre RewriteRule directive :

Lorsque vous demandez une redirection à http://localhost/sitefolder/subcat/38/web-design时,它将被此处的第一条规则捕获,该规则将请求重写为detail.php? q=subcat/39&slug=web-design,而不是您期望的 subcat.php 。这可能失败,因为q=subcat/39可能无效(我猜是触发了到/sitefolder/) ?

Vous devez modifier l'ordre de ces règles et/ou rendre l'expression régulière plus spécifique pour éviter les conflits. Par exemple. Si q 应该是数字 ID,则仅匹配数字值 (d+), au lieu de littéralement n'importe quoi (.*), c'est ce que vous associez actuellement.

Vous devez également inclure des ancres de fin de chaîne dans vos expressions régulières, sinon ces règles correspondront également aux URL réécrites et provoqueront des boucles inutiles. Par exemple :

RewriteRule ^contact-us$ contact-us.php [L,NC]

Je remettrais également en question l'utilisation du drapeau NC 标志,因为它可能会通过允许 contact-usNC ici, car il permettrait potentiellement à contact-us et CONTACT-US

(et tout le reste) d'accéder à la même ressource.

Résumé

En d’autres termes, votre règle devrait ressembler davantage à ceci :

RewriteRule ^contact-us$ contact-us.php [L]
RewriteRule ^login$ login.php [L]
RewriteRule ^register$ register.php [L]
RewriteRule ^search$ search.php [L]
RewriteRule ^about-us$ about-us.php [L]
RewriteRule ^cats$ categories.php [L]
RewriteRule ^(\d+)/([\w-]+)$ detail.php?q=&slug= [L]
RewriteRule ^subcat/(\d+)/([\w-]+)$ subcat.php?q=&slug= [L]
RewriteRule ^profile/(\d+)/([\w-]+)$ show_profile.php?q=&slug= [L]
w[a-zA-Z0-9_] (w est une classe de caractères abrégés pour

[a-zA-Z0-9_].)

🎜En rendant votre expression régulière plus spécifique, vous pouvez éviter les conflits. Ces instructions sont exécutées de haut en bas. La première règle correspondante gagne. 🎜
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!