2012-12-10 155 views
1

我有四個網址我想要重寫。結合Mod_rewrite規則

  1. domain.com/index.php?id=1234 => domain.com/1234
  2. domain.com/a.php?id=1234 => domain.com/a/1234
  3. domain.com/b.php?id=4321 => domain.com/b/4321
  4. domain.com/gallery.php => domain.com/gallery

其中,索引檢查數據庫和重定向到正確的頁面(a,b,c.php - ect),如果沒有找到有效的ID,則重定向到gallery.php。

我可以自己編寫適用於每個案例的RewriteRule,但是我不知道如何編寫它來處理所有這些規則,而不會違反規則。

這是我目前的mod_rewrite的.htaccess文件:

RewriteEngine On 

RewriteCond %{REQUEST_URI} !/gallery$ #excludes case 4 

RewriteRule ^(.*)$ index.php?id=$1 #handles case 1 

RewriteRule ^(.*)/(.*)$ $1.php?id=$2 #handles cases 2 and 3 

RewriteCond %{REQUEST_URI} /gallery$ 
RewriteRule ^/gallery$ /gallery.php [L] #handles case 4 

這使得一切都重定向到domain.com/gallery.php和錯誤出在嘗試過多的重定向。即使我放入domain.com/a/1234,也會被重定向到domain.com/a/gallery.php

如何更好地分離這些情況 - 如果它匹配domain.com/1234後停止1 - 如果它匹配domain.com/a/1234停止案例2和3 - 如果domain.com/gallery停止domain.com/gallery.php後調用...

感謝您的幫助所有!

回答

1

這種替換代碼:

RewriteRule ^gallery/?$ /gallery.php [L,NC] #handles case 4 

RewriteRule ^([^/]+)/([^/]+)/?$ /$1.php?id=$2 [L,QSA] #handles cases 2 and 3 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+)$ /index.php?id=$1 [L,QSA] #handles case 1 
+0

你是一個生命的救星!這很好!所以讓我確保我理解這裏的邏輯:RewriteCond只適用於下一個RewriteRule?所以如果我需要額外的RewriteCond來允許像css和圖像和字體這樣的東西,我必須在每個RewriteRule之前放置這些RewriteConds? –

+0

不客氣。是的,RewriteCond只適用於下一個RewriteRule。 – anubhava