Heim  >  Fragen und Antworten  >  Hauptteil

htaccess erlaubt keinen Zugriff auf Unterverzeichnisse mit Parametern

Ich versuche, htaccess für SEO-URLs zu erstellen. Ich habe htaccess erstellt. Alle URLs funktionieren einwandfrei, außer Unterordnern mit Parametern, sie leiten zum Site-Ordner weiter.

sitefolder ist mein Stammverzeichnis und alle meine Dateien sind dort.

Beispiel: Die URL sollte so aussehen:

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

In htaccess sieht es so aus:

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]

Der erste Parameter ist id und der zweite Parameter ist slug, aber keine dieser beiden URLs wird zur URL weitergeleitet.

Das ist mein gesamter htacces-Code:

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]

Auf diese Weise erhalte ich die Parameter in subcat.php und leite bei Fehlern nicht zum Index weiter, daher glaube ich nicht, dass es an PHP liegt :

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粉785905797P粉785905797176 Tage vor352

Antworte allen(1)Ich werde antworten

  • P粉450079266

    P粉4500792662024-03-31 14:53:01

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

    但是,此行似乎存在运行时错误:

    $pid = is_numeric($_GET['q']);

    is_numeric() 只是测试参数是否为数字并返回布尔值,它不会返回该变量的数字值,这正是您所期望的。因此,无论 q 的值如何,您的 SELECT 总是会失败(或返回第一项)。

    您可能需要这样的东西来检索指定 URL 参数的实际值:

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

    但是您需要首先验证这些 URL 参数(即 $_GET 变量)是否已传递,否则您的脚本将发出 E_NOTICE 消息。


    更新:

    与您的 RewriteRule 指令存在冲突:

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

    您需要更改这些规则的顺序和/或使正则表达式更加具体以避免冲突。例如。如果 q 应该是数字 ID,则仅匹配数字值 (\d+),而不是字面上的 任何内容 (.*< /code>),这就是您当前正在匹配的内容。

    您还应该在正则表达式中包含字符串结尾锚点,否则这些规则也将匹配重写的 URL 并导致不必要的循环。例如:

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

    我还会质疑此处使用 NC 标志,因为它可能会通过允许 contact-usCONTACT-US< 来创建重复内容问题/code> (以及之间的所有内容)访问相同的资源。

    摘要

    换句话说,你的规则应该更像这样:

    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=$1&slug=$2 [L]
    RewriteRule ^subcat/(\d+)/([\w-]+)$ subcat.php?q=$1&slug=$2 [L]
    RewriteRule ^profile/(\d+)/([\w-]+)$ show_profile.php?q=$1&slug=$2 [L]

    \w[a-zA-Z0-9_] 的简写字符类。)

    通过使正则表达式更加具体,您可以避免冲突。这些指令从上到下执行。第一个匹配的规则获胜。

    Antwort
    0
  • StornierenAntwort