mod_rewrite,无法重写现有文件

时间:2011-09-28 09:29:02

标签: .htaccess mod-rewrite

我正在尝试使用.htaccess中的mod_rewrite将目录中的所有图像传递给watermark.php。

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

它在本地计算机上运行正常,但在我的在线生产服务器(共享主机)上,所有图像文件都可以在不重写的情况下提供。

mod_rewrite在线启用,但如果文件存在则忽略该规则。

可能出现什么问题?

更新

这是我的完整设置:在主域的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]

img文件夹中的.htaccess:

<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文件夹中的现有图像未重新编辑。 Apache只是按原样提供服务。但是,例如,如果我请求不存在的文件,则规则有效并且echo $_GET['path']将完整的文件路径打印到不存在的文件。

2 个答案:

答案 0 :(得分:4)

以下是您可以使用的内容:

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 =&gt; path = /logo.jpg

更新:

由于规则位于不同的文件夹中,并且IMG的根目录为/home/username/public_html/img/,因此watermark.php文件不存在。将您需要的文件(watermark.php及其库)复制到IMG文件夹或创建symblink。

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

答案 1 :(得分:0)

htaccess更改:

Options -Indexes +FollowSymLinks

作者

Options -Indexes +FollowSymLinks -MultiViews

此行为模型存在于Apache 2.4 ..