htaccess tidak membenarkan akses kepada subdirektori dengan parameter
P粉785905797
P粉785905797 2024-03-30 20:05:48
0
1
434

Saya cuba mencipta htaccess untuk url seo, saya mencipta htaccess semua url berfungsi dengan baik kecuali subfolder dengan parameter, mereka mengubah hala ke folder tapak.

sitefolder ialah direktori akar saya dan semua fail saya ada di sana.

Contoh: URL sepatutnya kelihatan seperti ini:

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

Dalam htaccess ia kelihatan seperti ini:

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]

Parameter pertama ialah id dan parameter kedua ialah slug, tetapi kedua-dua url ini tidak akan pergi ke url.

Ini semua kod htacces saya:

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]

Ini adalah cara saya mendapatkan parameter dalam subcat.php dan saya tidak mengubah hala ke indeks apabila ralat, jadi saya rasa ia bukan kerana 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

membalas semua(1)
P粉450079266

Jika subcat.php 被调用(正如您在评论中所述),那么 .htaccess 不是问题。但是您发布的任何代码中都没有重定向到 index.php (atau apa-apa jenis ubah hala).

Walau bagaimanapun, nampaknya terdapat ralat masa jalan dengan baris ini:

$pid = is_numeric($_GET['q']);
Walau apa pun nilai

is_numeric() 只是测试参数是否为数字并返回布尔值,它不会返回该变量的数字值,这正是您所期望的。因此,无论 q, PILIHAN anda akan sentiasa gagal (atau mengembalikan item pertama).

Anda mungkin memerlukan sesuatu seperti ini untuk mendapatkan semula nilai sebenar parameter URL yang ditentukan:

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

Tetapi anda perlu terlebih dahulu mengesahkan bahawa parameter URL ini (iaitu $_GET pembolehubah) diluluskan, jika tidak skrip anda akan mengeluarkan mesej E_NOTICE.


Kemas kini:

Bercanggah dengan arahan RewriteRule anda:

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

Anda perlu menukar susunan peraturan ini dan/atau menjadikan regex lebih khusus untuk mengelakkan konflik. Sebagai contoh. Jika q 应该是数字 ID,则仅匹配数字值 (d+), bukannya apa-apa sahaja (.*), itulah yang anda padankan pada masa ini.

Anda juga harus memasukkan penambat hujung rentetan dalam ungkapan biasa anda, jika tidak, peraturan ini juga akan sepadan dengan URL yang ditulis semula dan menyebabkan gelung yang tidak perlu. Contohnya:

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

Saya juga akan mempersoalkan penggunaan bendera NC 标志,因为它可能会通过允许 contact-usNC di sini, kerana ia berpotensi membenarkan hubungi kami dan HUBUNGI KAMI

(dan segala-galanya di antaranya) untuk mengakses sumber yang sama.

Ringkasan

Dalam erti kata lain, peraturan anda sepatutnya kelihatan lebih seperti ini:

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 ialah kelas aksara singkatan untuk

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

🎜Dengan menjadikan ungkapan biasa anda lebih khusus, anda boleh mengelakkan konflik. Arahan ini dilaksanakan dari atas ke bawah. Peraturan padanan pertama menang. 🎜
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan