我的软件支持多个域名,所有域名都指向服务器上的同一目录(当然,每个域名都有不同的数据库)。所以这些域。
www.example1.com
www.example2.com
www.example3.com...all指向...
/public_html/在图像目录中...
/public_html/images/我有与每个网站的主机名完全匹配的目录:
/public_html/images/www.example1.com/
/public_html/images/www.example2.com/
/public_html/images/www.example3.com/我正在尝试让Apache重写请求,以便如果您直接查看图像并查看地址栏,则只能看到主机名一次。
所以请求..。
http://www.example1.com/images/book.pngApache在...获取的...is
/public_html/images/www.example1.com/book.png下面是我尝试过并在不同情况下取得成功的一件事,尽管它在这种情况下不起作用:
RewriteRule ^[^/]*/images(.+) images/%{HTTP_HOST}/$1发布于 2012-02-06 07:16:57
尝试将以下内容添加到站点根目录(public_html)的.htaccess文件中
RewriteEngine on
RewriteBase /
#prevent looping from internal redirects
RewriteCond %{ENV:REDIRECT_STATUS} !200
#only rewrite gif, jpg or png
RewriteRule ^(images)(/.+\.(gif|jpg|png))$ $1/%{HTTP_HOST}$2 [L,NC] 你的规则
RewriteRule ^[^/]*/images(.+) images/%{HTTP_HOST}/$1因为您在images之前有一个领先的/,所以不起作用。在.htaccess中,前导/被删除,因此规则永远不会匹配。
发布于 2012-02-06 04:05:46
这是我为我的高性能框架所做的事情之一(参见我的简历)。
我给你一个高级RewriteRule,我很确定你会有足够的材料来完成:
创建静态域:
static.example1.com
static.example2.com
static.example3.com你所有的图像都会出现在那里。
从现在开始,不再有:
www.example1.com/images/www.example1.com/picture.jpg
www.example2.com/images/www.example2.com/picture.jpg
www.example3.com/images/www.example3.com/picture.jpg但
static.example1.com/picture.jpg
static.example2.com/picture.jpg
static.example3.com/picture.jpg漂亮的URL是吧?现在使用所有静态文件创建一个vhost:
<VirtualHost *>
ServerName static.example1.com
ServerAlias static.example2.com static.example3.com
</VirtualHost>将文档根目录设置为不带vhost名称的基目录,因此在本例中:
DocumentRoot "/public_html/images"并添加此RewriteRule
RewriteCond %{HTTP_HOST} ^static\.([a-zA-Z0-9\-]+)\.com$
# Change the path, and add the request:
RewriteRule (.*) %{DOCUMENT_ROOT}/static.%1.com$1 [QSA,L]所以总而言之:
<VirtualHost *>
ServerName static.example1.com
ServerAlias static.example2.com static.example3.com
RewriteCond %{HTTP_HOST} ^static\.([a-zA-Z0-9\-]+)\.com$
# Change the path, and add the request:
RewriteRule (.*) %{DOCUMENT_ROOT}/static.%1.com$1 [QSA,L]
</VirtualHost>好吧,这并不完全符合你的问题,所以这是一个简短的答案,但我不喜欢它,因为它不能帮助你做一个非常(非常)好的工作:
RewriteCond %{HTTP_HOST} ^www\.(example1|example2|example3)\.com$
# Change the path:
RewriteRule (.*)(\.(css|js|txt|htc|pdf|jpg|jpeg|gif|png|ico))$ %{DOCUMENT_ROOT}/www.%1.com$1$2 [QSA,L]如果这还不够:
两个提示:
如果你不是在托管环境中 (=如果它是你自己的服务器,并且你可以修改虚拟主机,而不仅仅是.htaccess文件),试着使用RewriteLog指令:它可以帮助你追踪到这样的问题:
# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On我最喜欢用来检查regexp的工具:
http://www.quanetic.com/Regex (别忘了选择ereg(POSIX)而不是preg(PCRE)!)
发布于 2012-02-06 07:25:07
约翰
我刚刚发布了一篇关于你面临的一些挑战的separate Q。我欢迎您的评论,但回到您的挑战:您可以使用环境变量来存储您的(最好是经过验证的)主机的一个诀窍,例如:
RewriteCond %{HTTP_HOST} ^www\.(host1|host2|host3\.com
RewriteRule ^ - [E=HOST:%1]您可能还想在规则中添加S标志来实现if/then/else逻辑。您还可以在以下规则或条件字符串(不是regexp模式)中使用主机变量作为%{ENV: HOST }。
您还需要清楚地查看完整的phpinfo()报告,以了解您的托管服务使用的是mod_php还是mod_suPHP,...支持DNS多宿主的接口和主机。例如,我的供应商设置了%{ENV:DOCUMENT_ROOT_REAL},我在检查文件空间时需要使用它而不是%{DOCUMENT_ROOT}。
所有到达DOCROOT/的URI都是http://www.exampleX.com/images/book.png格式的,所以如果您的.htaccess位置是DOCROOT,那么您的基础就是/。因此,假设上面的ENV设置,这些应该是有效的
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(host1|host2|host3)\.com
RewriteRule ^ - [E=HOST:%1]
RewriteCond %{ENV:HOST}==%{REQUEST_URI} !^(.*?)==/image/\1
RewriteRule ^image/(.*) image/%{ENV:HOST}/$1 [L,NS] cond是停止重写规则循环的一个错误。
泛化版本
上面的解决方案是一个已经泛化的解决方案,就像你一样。只需将RewriteCond正则表达式替换为与您自己的命名约定匹配的任何模式,我同意如果是(.*),那么您也可以丢弃第一个规则,将%{ENV:HOST}替换为%{HTTP_HOST}.您需要RewriteCond保护以防止导致500的循环。
https://stackoverflow.com/questions/9151876
复制相似问题