我正在设置一个开发服务器,这样我就不再需要直接编辑远程服务器上的文件,也不再需要使用 SVN 进行版本管理。
由于某些网站的图像非常多(3-30gb),我们决定不将图像包含在 SVN 存储库中。
因此,我建立了一个系统,为所有子域提供自己的虚拟文档根目录,因此http://[user].[domain].testdomain.com
获取的虚拟文档根目录/working/[user]/[domain]/httpdocs
是所有用户的工作副本。
(我不知道这是否相关,但可能有用)
但是,为了进行全面测试,显示图像会很有用。开发服务器还兼作备份服务器,因此所有图像都在服务器上。我想通过一个巧妙的 htaccess/php 脚本组合显示所有缺失的图像。
我目前正在使用这些规则:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} \.(gif|jpg|jpeg|png)$
RewriteRule (.*) http://testdomain.com/fallback.php?image=$1 [L]
但这并不完全按照计划进行,因为我无法从中获取子域信息。此外,由于重定向 URL 包含完整域,因此它会被完全重定向,这使其成为额外的 http 请求。
理想的设置是所有缺失的图像都由位于的单个 PHP 脚本提供,http://testdomain.com/fallback.php
并且图像由其原始 URL 提供(如http://me.webshop.testdomain.com/images/header.png
),但我似乎无法让它工作。
这有可能吗?如果可以,有什么建议告诉我该怎么做吗?
ps 另外,上面提供的规则似乎会在双子域(user.webshop.testdomain.com
)上的每个图像请求上触发,但它的工作方式与应该的一样webshop.testdomain.com
,这是为什么呢?
//编辑:
这解决了我的问题:
RewriteCond %{HTTP_HOST} ^([^\.]+)\.([^\.]+)\.domain\.nl [NC]
RewriteCond /working/%1/%2/httpdocs%{REQUEST_URI} !-F
RewriteCond %{REQUEST_URI} \.(gif|jpg|jpeg|png)$
RewriteRule (.*) http://domain.nl/fallbackimages/fallback.php?image=$1&host=%{HTTP_REFERER}&oeps=%{HTTP_HOST} [P]
答案1
如果您想访问子域名(我假设在 PHP 文件中使用),您可以尝试以下操作:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} \.(gif|jpg|jpeg|png)$
RewriteCond %{HTTP_HOST} ([^\.]*)\.([^\.]*)\.testdomain\.com$
RewriteRule (.*) http://testdomain.com/fallback.php?image=$1&user=%1&subdomain=%2 [P]
我将[L]
标志更改为[P]
,这将代理请求,而不是重定向请求。这确实需要mod_proxy
启用。%1
和%2
允许访问上一个中的正则表达式组RewriteCond
另外,我不确定为什么RewriteRule
每次有两个子域的请求都会触发您的请求,因为不应该这样。您可以打开重写日志,看看它匹配的是什么。
希望这可以帮助。