我试图使用.htaccess中的mod_rewrite将目录中的所有图像传递给watermark.php进行处理。
文件夹中的.htaccess:
问题在于img文件夹中已有的图片没有被重写。Apache只是按原样提供它们。但是,如果我请求不存在的文件,则规则起作用,并且echo $_GET [ 'path']会打印出不存在的文件的完整文件路径。
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]
<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']会打印出不存在的文件的完整文件路径。
/home/username/public_html/
,而 img.example.com 的 document_root 是/home/username/public_html/img/
。 - sevenWonderswatermark.php
已经在/home/username/public_html/img/
中。 - sevenWonders$path = isset($_GET['path']) ? $_GET['path'] : ''; echo $path;
但它就是无法到达。我猜测共享主机的子域配置出了问题(因为在我的本地机器上一切都正常)。也许我会尝试重新编写整个程序,不使用子域。 - sevenWonders