我正在嘗試為 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(); }
如果
subcat.php
被呼叫(如您在評論中所述),那麼.htaccess
不是問題。但是您發布的任何程式碼中都沒有重定向到index.php
(或任何類型的重定向)。但是,此行似乎存在運行時錯誤:
is_numeric()
只是測試參數是否為數字並傳回布林值,它不會傳回該變數的數字值,這正是您所期望的。因此,無論q
的值為何,您的 SELECT 總是會失敗(或傳回第一項)。您可能需要這樣的東西來檢索指定 URL 參數的實際值:
但您需要先驗證這些 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/
的重定向)?您需要更改這些規則的順序和/或使正規表示式更加具體以避免衝突。例如。如果
q
應該是數字ID,則只符合數字值(\d
),而不是字面上的任何內容 (.*),這就是您目前正在匹配的內容。
您還應該在正規表示式中包含字串結尾錨點,否則這些規則也會匹配重寫的 URL 並導致不必要的循環。例如:
我也會質疑這裡使用
NC
標誌,因為它可能會通過允許contact-us
和CONTACT-US (以及之間的所有內容)存取相同的資源。
摘要
換句話說,你的規則應該要更像這樣:
(
\w
是[a-zA-Z0-9_]
的簡寫字元類別。)透過讓正規表示式更加具體,您可以避免衝突。這些指令從上到下執行。第一個匹配的規則獲勝。