Maison > Questions et réponses > le corps du texte
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粉4500792662024-03-31 14:53:01
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/
) ? < /p>
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 (.*< /code>), 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-us
NC ici, car il permettrait potentiellement à contact-us
et < 来创建重复内容问题/code>CONTACT-US
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. 🎜