mod_rewrite,无法重写现有文件。

3
我试图使用.htaccess中的mod_rewrite将目录中的所有图像传递给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)/

public_html文件夹中的.htaccess:

<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:

<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个回答

4

这是您可以使用的内容:

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

第一个RewriteRule的设置是为了确保人们不会进入那个文件夹,它会给出403权限被拒绝的提示(这是可选的)。
第二个RewriteRule将匹配字母、数字、破折号、下划线和点以及扩展名为jpg、jpeg、png和gif的任何图像重定向到您的watermark.php文件。例如: http://www.domain.com/logo.jpg => path = /logo.jpg
更新:
由于规则位于不同的文件夹中,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)

除了其他规则(请参见lazyone的评论),如果您在watermark.php中回显$_GET ['path'],您会看到什么? - Book Of Zeus
example.com 的 document_root 是 /home/username/public_html/,而 img.example.com 的 document_root 是 /home/username/public_html/img/ - sevenWonders
watermark.php 已经在 /home/username/public_html/img/ 中。 - sevenWonders
现在我的watermark.php看起来是这样的:$path = isset($_GET['path']) ? $_GET['path'] : ''; echo $path; 但它就是无法到达。我猜测共享主机的子域配置出了问题(因为在我的本地机器上一切都正常)。也许我会尝试重新编写整个程序,不使用子域。 - sevenWonders
1
我会说是的,请仔细检查您的子域配置,因为我将这段代码复制粘贴到我的网站上它可以运行(如果您想要的话,我可以向您展示)。或者,尝试将子域和域放在同一级别。例如:www.domain.com = /home/user/domain.com/public_html/,sub.domain.com => /home/user/domain.com/sub_public_html/。 - Book Of Zeus
显示剩余4条评论

0

htaccess更改:

Options -Indexes +FollowSymLinks

作者

Options -Indexes +FollowSymLinks -MultiViews

这种行为在Apache 2.4仍然存在。


1
你确定这是原问题的解决方案吗? - Dharman
是的,我也有完全相同的一个。 - Bruno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接