2012-07-23 102 views
1

我有一個圖像緩存系統,即時通訊使用生成某些圖像大小的要求。我使用modrewrite檢查文件,並調用圖像創建系統,如果它不存在。即時圖像確實存在,即時調用圖像創建系統即可解決問題。modrewrite -f被忽略

的modrewrite是很簡單的(子目錄中的圖片的網站)

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /images/index.php?id=$1 [L,QSA] 

我甚至試圖消除-d櫃面目錄支票被混淆了。我現在已經知道了它,以便它檢查index.php代碼中存在的文件 - 它報告它。

我在html中使用url images/cache/140x20/Test.JPG - 文件存在,所以RewriteCond不應該調用index.php代碼 - 但它出於某種原因?

我敢肯定它的東西很明顯,但我只是不能想出辦法來

+0

這聽起來像有一個路徑混淆。文檔根目錄中是否有htaccess文件?你可以添加一個'R = 302'作爲標誌來看看它真的獲得了什麼路徑? – 2012-07-23 16:07:03

+0

.htaccess位於images目錄中。使用R = 302我得到了預期的正確路徑www.domain.com/images/index.php?id=cache/140x20/Test.JPG – 2012-07-23 17:07:27

回答

1

中的.htaccess是在images目錄。使用R = 302我得到了預期的正確路徑www.domain.com/images/index.php?id=cache/140x20/Test.JPG

這很奇怪。我在一個子目錄下進行測試,並且得到了一些意想不到的值%{REQUEST_FILENAME}。但是我能夠通過從文檔根重建來正確工作。也許我對%{REQUEST_FILENAME}的理解或者apache用來製作URI路徑到文件路徑的底層機制與我所期望的不同。

嘗試:

RewriteCond %{DOCUMENT_ROOT}${REQUEST_URI} !-f 
RewriteCond %{DOCUMENT_ROOT}${REQUEST_URI} !-d 
# and maybe for good measure 
RewriteCond %{REQUEST_URI} !index.php 

編輯:

如果你的擴展名是全部大寫,但圖像文件擴展名總是全部小寫,您可以使用RewriteMap並使用定義地圖tolower功能:

(在您的服務器或vhost配置中的某處:

RewriteMap lowercase int:tolower 

然後在你的htaccess文件(你上面的其他規則),更改文件名改爲小寫:

# first check to make sure request doesn't already have all lowercase image extension 
RewriteCond %{REQUEST_URI} !\.(jpe?g|png|bmp|gif)$ 
RewriteRule ^(.*)\.(jpe?g|png|bmp|gif)$ /$1.${lowercase:$2} [NC,L] 

你也可以做完整的文件名,或者整個路徑類似的東西。

+0

是否一樣。我只注意到實際目錄結構中的擴展名是小寫的。這可能是案件的差異,可能導致它。我試圖改變URL但它似乎沒有區別 – 2012-07-23 17:46:43

+0

@AdrianBrown!-f絕對區分大小寫。 – 2012-07-25 21:06:45

+0

@AdrianBrown只是爲了調試,如果您將規則更改爲'RewriteRule ^(。*)$ /images/index.php?id=%{REQUEST_FILENAME} [R,L,QSA]',您會將哪些網址重定向到? – 2012-07-25 21:08:49