.htaccess mod#u rewrite,can';不要重写现有文件

.htaccess mod#u rewrite,can';不要重写现有文件,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,我正在尝试使用mod_rewrite in.htaccess将目录中的所有图像传递到watermark.php RewriteEngine On RewriteCond %{REQUEST_FILENAME} -f RewriteRule \.jpg$ /watermark.php?path=%{REQUEST_FILENAME} [L] 它在本地机器上运行良好,但在我的在线生产服务器(共享主机)上,所有图像文件都可以无需重写 mod_rewrite是联机启用的,但如果文件存在,它将忽略该规则

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

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule \.jpg$ /watermark.php?path=%{REQUEST_FILENAME} [L]
它在本地机器上运行良好,但在我的在线生产服务器(共享主机)上,所有图像文件都可以无需重写

mod_rewrite是联机启用的,但如果文件存在,它将忽略该规则

有什么不对劲吗

更新

这是我的完整设置:在主域的文档根目录的子文件夹中有一个带有子域的域

public_html (example.com DOCUMENT_ROOT)/
    img (img.example.com DOCUMENT_ROOT)/
.htaccess位于公用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
文件夹中的现有图像没有被重写。Apache只是按原样服务它们。但是,例如,如果我请求不存在的文件,则规则将起作用,
echo$\u GET['path']
将完整的文件路径打印到不存在的文件

以下是您可以使用的:

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文件。例如:

=>路径=/logo.jpg

更新:

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

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

Options -Indexes +FollowSymLinks


Apache2.4上存在此行为。

我尝试过,但仍然:对不存在文件的请求被重写为watermark.php很好,但如果请求了现有文件,则按原样处理,忽略watermark.php:(@sevenWonders除了此规则之外,还有其他重写规则吗?如果有,请显示所有规则。此外,还有其他规则(请参阅lazyone评论)如果您在watermark.php中回显$_GET['path'],您会看到什么?因此example.com文档根目录与img.example.com文档根目录相同?我会说是的,请仔细检查您的子域配置,因为我将此代码复制并粘贴到我的子域配置中,并且它可以工作(如果您愿意,我可以向您展示)-或-尝试将子域和域放在同一级别。例如:www.domain.com=/home/user/domain.com/public_html/和sub.domain.com=>/home/user/domain.com/sub_public_html/您确定这是解决原始问题的方法吗?是的,我有完全相同的方法
Options -Indexes +FollowSymLinks
Options -Indexes +FollowSymLinks -MultiViews