我正在尝试使用.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']
将完整的文件路径打印到不存在的文件。
答案 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 ..