2012-10-18 62 views
1
可變

我實際的.htaccess是URL目錄與htaccess的

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([_0-9a-zA-Z-]+)? index.php?cl=$1 [L] 

,當我像sub.domain.com/client1輸入的東西(然後我得到了$ CL變量在我的PHP代碼妥善它的工作好)。問題是當我添加一個像sub.domain.com/client1/最後的斜線,然後我得到「client1 /」在我的變種!

我該如何解決?我知道我的htaccess中的第二個條件是查找現有目錄並跳過重寫規則,但在我的服務器上沒有「client1」目錄!

回答

0

只要求在比賽消耗整個URL路徑:如果請求的路徑,用(任選)一個或多個字母,數字和/或開始

# Note the trailing $ on the pattern 
RewriteRule ^([_0-9a-zA-Z-]+)?$ index.php?cl=$1 [L] 

當前標準的,你的模式將檢查下劃線和破折號字符 - 但它不會限制自己。所以它會匹配a/b/c/d/e/f/g沒有投訴。如果變量從來沒有包含模式以外的任何內容,則添加$(這意味着「在此情況下字符串結束」)會限制您的匹配。

+0

我已經嘗試在最後添加$,但它返回一個404頁面!請記住,htaccess在子域中(即在服務器的目錄中,而不是在根目錄中)。這可能是問題嗎? –

1

「問題是當我添加一個像sub.domain.com/client1/最後的斜槓,然後我在我的變種」client1 /「!」

這是預期的行爲。您需要剝離之後通過PHP的斜線:

$cl = trim($_REQUEST['cl'], '/'); 

或您爆炸值獲取所有文件夾(如果有斜線後以下的別稱)

$cl = explode('/', $_REQUEST['cl']); 
+0

問題是,我在html頁面(js,css等等)中有很多相對URL,它們引用client1/dir而不是root!並且我無法在這些網址中使用絕對網址(由於某些原因,我現在無法解釋) –

+0

@ user1753054什麼?你說你的服務器上沒有目錄'client1'。腳本如何能夠駐留在該目錄中?爲什麼不在你的HTML head中設置一個'? – feeela

+0

是啊!它現在工作正常!許多TNX! :) –

0

我試圖做非常類似的東西,這對我的作品:

RewriteEngine on 
RewriteCond %{REQUEST_URI} !^$ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

RewriteRule ^([^\/]+)$ index.php?arg1=$1&arg2=default [L] 
RewriteRule ^([^\/]+)\/$ index.php?arg1=$1&arg2=default [L] 
RewriteRule ^([^\/]+)\/([^\/]+)$ index.php?arg1=$1&arg2=$2 [L] 
RewriteRule ^([^\/]+)\/([^\/]+)\/$ index.php?arg1=$1&arg2=$2 [L] 

重寫規則將退出,如果條件是發現了針對每個較長的URL路徑此逐步檢查。

而不是隻爲「_0-9a-zA-Z-」字符進行過濾,因爲它允許所有字符不是「/」,因爲在每個參數之間我查找字面值「/」。

您可以根據需要擴展此參數。而對於超出此規則接受的參數數量的URL,用戶應該進入錯誤404頁面,由您的根.htaccess設置。