Mod 重写子域中所有丢失的图像

Mod 重写子域中所有丢失的图像

我正在设置一个开发服务器,这样我就不再需要直接编辑远程服务器上的文件,也不再需要使用 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每次有两个子域的请求都会触发您的请求,因为不应该这样。您可以打开重写日志,看看它匹配的是什么。

希望这可以帮助。

相关内容