htaccess不允許存取帶有參數的子目錄
P粉785905797
P粉785905797 2024-03-30 20:05:48
0
1
382

我正在嘗試為 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粉785905797
P粉785905797

全部回覆(1)
P粉450079266

如果 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/的重定向)?

您需要更改這些規則的順序和/或使正規表示式更加具體以避免衝突。例如。如果q 應該是數字ID,則只符合數字值(\d ),而不是字面上的任何內容 (.*),這就是您目前正在匹配的內容。

您還應該在正規表示式中包含字串結尾錨點,否則這些規則也會匹配重寫的 URL 並導致不必要的循環。例如:

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

我也會質疑這裡使用NC 標誌,因為它可能會通過允許contact-usCONTACT-US (以及之間的所有內容)存取相同的資源。

摘要

換句話說,你的規則應該要更像這樣:

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_] 的簡寫字元類別。)

透過讓正規表示式更加具體,您可以避免衝突。這些指令從上到下執行。第一個匹配的規則獲勝。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!