【问题标题】:mod_rewrite, can't rewrite existing filemod_rewrite,不能重写现有文件
【发布时间】:2011-11-26 17:18:46
【问题描述】:

我正在尝试使用 .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)/

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]

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'] 将完整的文件路径打印到不存在的文件。

【问题讨论】:

    标签: .htaccess mod-rewrite


    【解决方案1】:

    以下是您可以使用的:

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

    第一个RewriteRule 设置为确保人们不会进入该文件夹 - 它给出了 403 权限被拒绝(这是可选的)

    第二个会将任何匹配字母、数字、破折号、下划线和点的图像重定向到您的 watermark.php 文件。例如:

    http://www.domain.com/logo.jpg => 路径 = /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)
    

    【讨论】:

    • 我试过了,但仍然:对不存在文件的请求被重写为 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/
    【解决方案2】:

    htaccess 更改:

    Options -Indexes +FollowSymLinks
    

    通过

    Options -Indexes +FollowSymLinks -MultiViews
    

    这种行为钢存在于 Apache 2.4..

    【讨论】:

    • 你确定这是原始问题的解决方案吗?
    • 是的,我有完全一样的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多