2011-09-28 19 views
3

我想通過.htaccess中的mod_rewrite將目錄中的所有圖像傳遞給watermark.php。mod_rewrite,無法重寫現有文件

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule \.jpg$ /watermark.php?path=%{REQUEST_FILENAME} [L] 

它可以在本地機器上很好,但我的在線生產服務器上(共享主機)的所有圖像文件而無需重寫服務。

mod_rewrite在線啓用,但如果文件存在,則忽略規則。

什麼可能是錯的?

UPDATE

這裏是我的全部設置:有一個與主域的document_root的子文件夾的子域的域。

public_html (example.com DOCUMENT_ROOT)/ 
    img (img.example.com DOCUMENT_ROOT)/ 

的.htaccess中的public_html文件夾:

<FilesMatch "\.(inc\.php|log)$"> 
    Deny from all 
</FilesMatch> 
Options -Indexes +FollowSymLinks 
php_value short_open_tag 0 

php_value auto_prepend_file /home/username/public_html/bootstrap.inc.php 

RewriteEngine On 

RewriteCond %{HTTP_HOST} ^img\. [NC] 
RewriteRule .* - [L] 

RewriteCond %{HTTP_HOST} ^www\.(.+) [NC] 
RewriteRule ^(.*)$ http://%1/$1 [R=301,L] 

RewriteCond %{HTTP_HOST} ^example\. [NC] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ shop/$1 [L] 

的.htaccess中img文件夾:

<FilesMatch "\.(inc|log)$"> 
    Deny from all 
</FilesMatch> 
Options -Indexes +FollowSymLinks 

php_value short_open_tag 0 
php_value auto_prepend_file none 

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule \.jpg$ /watermark.php?path=%{REQUEST_FILENAME} [L]  

的問題是,在img文件夾中現有的圖像不rewrited。 Apache只是按照原樣服務它們。但是,例如,如果我請求不存在的文件,該規則將起作用,並且echo $_GET['path']將完整的文件路徑打印到不存在的文件。

回答

3

這裏是您可以使用的:

RewriteEngine On 
RewriteRule ^(media|image|images)(/?)(.*)$ - [F] 
RewriteRule ^([a-z0-9\-_\.]+)\.(jpg|jpeg|png|gif)$ /watermark.php?path=%{REQUEST_URI} [L] 

第一RewriteRule設置,以確保人們不會去那個文件夾 - 它給剝奪了403權限(可選的)

的第二個將重定向任何匹配字母,數字,短劃線,下劃線和點的圖像,並帶有擴展名:jpg,jpeg,png和gif到您的watermark.php文件。例如:

http://www.domain.com/logo.jpg =>路徑= /logo.jpg

UPDATE:

由於規則是在不同的文件夾和IMG的根目錄是/home/username/public_html/img/的watermark.php文件不存在。將您需要的文件(watermark.php及其庫文​​件)複製到IMG文件夾或創建符號鏈接。

cd /home/username/public_html/img/ 
ln -s ../watermark.php (and other library files as well) 
+0

我試了一下,但還是:對於不存在的文件請求rewrited到watermark.php得很好,但如果要求現有的文件 - 它擔任是,忽略watermark.php :( – sevenWonders

+0

@sevenWonders你有除此之外的其他任何重寫規則?如果是 - 請顯示所有這些規則。 – LazyOne

+0

除了其他規則(請參閱lazyone註釋),如果您在watermark.php中回顯$ _GET ['path'],您會看到什麼? –