2012-09-27 61 views
0

我有一個包含此代碼」的.htaccess'文件:
(應該重定向像‘P7-product_number_7’的名字)重定向到子目錄的文件,如果存在有

RewriteEngine On 
RewriteBase/
# if: 
RewriteCond %{DOCUMENT_ROOT}/cache%{REQUEST_URI}.html -f 
# then: 
RewriteRule ([A-z])([0-9]+)-([^/]*)?$ /cache%{REQUEST_URI}.html [B,L] 
# else: 
RewriteRule ([A-z])([0-9]+)-([^/]*)?$ index.php?type=$1&id=$2&label=$3 [B,L] 

的檢查該文件的存在(在「緩存」目錄中)工作正常,但重定向不起作用。
爲什麼?

我曾嘗試使用 「重寫規則^(。*)$ /cache/$1.html [L]」,而不是第一個重寫規則,但它並沒有工作太。
(如果HTML文件不存在(在/ cache /中),重定向工作正常,'.htaccess'和'cache /'目錄位於'/ var/www'目錄中,因此%{REQUEST_URI}爲「/P7-product_number_7「)

回答

1

您的規則正在循環,因爲您沒有檢查URI的開頭。您可能會注意到,參數爲product_number_7.html.html結束。這意味着第一條規則被應用,那麼規則環,但第二次的首要條件失敗(因爲沒有P7-product_number_7.html.html),所以第二條規則被應用於:

  1. URI = /P7-product_number_7
  2. 條件檢查: %{DOCUMENT_ROOT}/cache%{REQUEST_URI}.html -f - >真
  3. 應用規則:比賽([A-z])([0-9]+)-([^/]*)?$ - >真
  4. URI改寫爲/cache/P7-product_number_7.html
  5. 開始URI /P7-product_number_7 = /cache/P7-product_number_7.html,重寫工程INE循環:
    1. URI = /cache/P7-product_number_7.html
    2. 條件檢查:%{DOCUMENT_ROOT}/cache%{REQUEST_URI}.html -f - >/cache/cache/P7-product_number_7.html.html不存在)
    3. 應用規則:比賽([A-z])([0-9]+)-([^/]*)?$ - >真(在/緩存/ P7-product_number_7匹配URI的 html的一部分)
    4. URI改寫爲/index.php?type=P&id=7&label=product_number_7.html

所以,你要麼需要在你的規則開頭加上沒有更多的重寫直通:

RewriteCond %{ENV:REDIRECT_STATUS} 200 
RewriteRule^- [L] 

或者你可以簡單地匹配URI的開始你的正則表達式:

# need^---v 
RewriteRule ^([A-z])([0-9]+)-([^/]*)?$ /cache%{REQUEST_URI}.html [B,L] 
# and here -v: 
RewriteRule ^([A-z])([0-9]+)-([^/]*)?$ index.php?type=$1&id=$2&label=$3 [B,L] 
相關問題