Rumah > Soal Jawab > teks badan
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粉4500792662024-03-31 14:53:01
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/
)? < /p>
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 (.*< /code>), 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-us
NC di sini, kerana ia berpotensi membenarkan hubungi kami
dan < 来创建重复内容问题/code>HUBUNGI KAMI
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. 🎜