首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache重写:基于HTTP主机的镜像目录

问Apache重写:基于HTTP主机的镜像目录
EN

Stack Overflow用户
提问于 2012-02-06 02:37:48
回答 3查看 4.6K关注 0票数 5

我的软件支持多个域名,所有域名都指向服务器上的同一目录(当然,每个域名都有不同的数据库)。所以这些域。

代码语言:javascript
复制
www.example1.com
www.example2.com
www.example3.com

...all指向...

代码语言:javascript
复制
/public_html/

在图像目录中...

代码语言:javascript
复制
/public_html/images/

我有与每个网站的主机名完全匹配的目录:

代码语言:javascript
复制
/public_html/images/www.example1.com/
/public_html/images/www.example2.com/
/public_html/images/www.example3.com/

我正在尝试让Apache重写请求,以便如果您直接查看图像并查看地址栏,则只能看到主机名一次。

所以请求..。

代码语言:javascript
复制
http://www.example1.com/images/book.png

Apache在...获取的...is

代码语言:javascript
复制
/public_html/images/www.example1.com/book.png

下面是我尝试过并在不同情况下取得成功的一件事,尽管它在这种情况下不起作用:

代码语言:javascript
复制
RewriteRule ^[^/]*/images(.+) images/%{HTTP_HOST}/$1
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-06 07:16:57

尝试将以下内容添加到站点根目录(public_html)的.htaccess文件中

代码语言:javascript
复制
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] 

你的规则

代码语言:javascript
复制
RewriteRule ^[^/]*/images(.+) images/%{HTTP_HOST}/$1

因为您在images之前有一个领先的/,所以不起作用。在.htaccess中,前导/被删除,因此规则永远不会匹配。

票数 2
EN

Stack Overflow用户

发布于 2012-02-06 04:05:46

这是我为我的高性能框架所做的事情之一(参见我的简历)。

我给你一个高级RewriteRule,我很确定你会有足够的材料来完成:

创建静态域:

代码语言:javascript
复制
static.example1.com
static.example2.com
static.example3.com

你所有的图像都会出现在那里。

从现在开始,不再有:

代码语言:javascript
复制
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

但

代码语言:javascript
复制
static.example1.com/picture.jpg
static.example2.com/picture.jpg
static.example3.com/picture.jpg

漂亮的URL是吧?现在使用所有静态文件创建一个vhost:

代码语言:javascript
复制
<VirtualHost *>
    ServerName static.example1.com
    ServerAlias static.example2.com static.example3.com
</VirtualHost>

将文档根目录设置为不带vhost名称的基目录,因此在本例中:

代码语言:javascript
复制
DocumentRoot "/public_html/images"

并添加此RewriteRule

代码语言:javascript
复制
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]

所以总而言之:

代码语言:javascript
复制
<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>

好吧,这并不完全符合你的问题,所以这是一个简短的答案,但我不喜欢它,因为它不能帮助你做一个非常(非常)好的工作:

代码语言:javascript
复制
    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指令:它可以帮助你追踪到这样的问题:

代码语言:javascript
复制
# 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)!)

票数 1
EN

Stack Overflow用户

发布于 2012-02-06 07:25:07

约翰

我刚刚发布了一篇关于你面临的一些挑战的separate Q。我欢迎您的评论,但回到您的挑战:您可以使用环境变量来存储您的(最好是经过验证的)主机的一个诀窍,例如:

代码语言:javascript
复制
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设置,这些应该是有效的

代码语言:javascript
复制
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的循环。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9151876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档