我正在嘗試為 seo url 建立 htaccess,我建立了 htaccess 所有 url 都工作正常,排除帶有參數的子資料夾,它們重定向到網站資料夾。
sitefolder
是我的根目錄,所有檔案都在那裡。
範例:網址應如下所示:
http://localhost/sitefolder/subcat/39/web-hosting http://localhost/sitefolder/profile/1/username
在 htaccess 中它是這樣的:
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]
第一個參數是 id,第二個參數是 slug,但這兩個 url 都不會轉到 url。
這是我所有的 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]
這就是我在 subcat.php
中取得參數的方式,我不會在錯誤時重定向到索引,所以我不認為這是因為 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
如果 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-us
和CONTACT-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=&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_]
的簡寫字元類別。)
透過讓正規表示式更加具體,您可以避免衝突。這些指令從上到下執行。第一個匹配的規則獲勝。