URL /子域重写(htaccess)

时间:2010-12-14 09:42:02

标签: .htaccess mod-rewrite url-rewriting

说我有以下文件:

http://www.example.com/images/folder/image.jpg

我想在

上提供服务

http://s1.example.com/folder/image.jpg

如何进行htaccess重写以指向它?

例如,我创建了一个子域s1.example.com,然后在该子域上,我添加了一个htaccess规则来指向任何文件,从http://www.example.com/images/拉出它

以这种方式提供服务文件是否可以作为来自无Cookie域的服务内容?

4 个答案:

答案 0 :(得分:18)

首先让我谈谈无Cookie域的概念。通常,当通过http请求任何内容时,任何相关的cookie都会随请求一起发送。 Cookie取决于它们来自哪个域。使用无cookie域的想法是,您将不具有cookie的静态内容(例如图像)重定位到单独的域,以便不会使用该请求发送cookie。这减少了少量的流量。

这样做有多少取决于页面的类型。你拥有的图像越多,你获得的就越多。如果您的网站加载了大量小图片,例如头像或图片缩略图,您可能会获得很多收益。相反,如果您的网站不使用任何cookie,您将无济于事。如果您的页面仅使用少量图像,那么完全有可能您的页面加载速度不会明显加快,无论如何都会在页面加载之间缓存这些图像。

有一点需要注意的是,为example.com设置的Cookie也会随s1.example.com的请求一起发送,因为“s1.”是example.com的子域名}。您需要使用www.(或您选择的任何其他子域名)来分隔Cookie空间。

其次,如果您认为无Cookie域实际上值得尝试,那么让我们来谈谈实施。

Shikhar的解决方案糟糕!虽然解决方案似乎在表面上起作用,但它实际上违背了使用无cookie域的目的。对于每张图片,首先尝试s1.网址。然后,s1.网址会重定向到www.域,从而触发第二个http请求。无论你如何看待它,这都是一种损失。您需要的是重写,它会在Web服务器内部更改URL,而浏览器甚至无法实现。

为简单起见,我假设所有域都指向同一目录,因此www.example.com/something = example.com/something = s1.example.com/something = blub.example.com/something。如果您确实需要将图像物理存储在“www.example.com/images”中,这会使事情变得更简单。

我推荐一个看起来像这样的.htaccess:

# Turn on rewrites
RewriteEngine On

# Rewrite all requests for images from s1, so they are fetched from the right place
RewriteCond %{HTTP_HOST} ^s1\.example\.com
# Prevent an endless loop from ever happening
RewriteCond %{REQUEST_URI} !^/images
RewriteRule (.+) /images/$1 [L]

# Redirect http://s1.example.com/ to the main page (in case a user tries it)
RewriteCond %{HTTP_HOST} ^s1\.example\.com
RewriteRule ^$ http://www.example.com/ [R=301,L]

# Redirect all requests with other subdomains, or without a subdomain to www.
# Eg, blub.example.com/something -> www.example.com/something
#     example.com/something      -> www.example.com/something
RewriteCond %{HTTP_HOST} !^www\.example\.com
RewriteCond %{HTTP_HOST} !^s1\.example\.com
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

# Place any additional rewrites below.

答案 1 :(得分:1)

如果您想将流量从www.example.com重定向到s1.example.com,请在www.example.com上使用以下htaccess

  

RewriteCond %{HTTP_HOST} ^(s1\.example\.com)
  RewriteRule (.*) http://www.example.com%{REQUEST_URI}[R=301,NC,L]

如果这不是您想要的,请进一步详述。

答案 2 :(得分:1)

只是因为喜欢我的人的一般信息可能正在调查这个的好处。从我正在阅读的内容来看,它不仅仅是减少了消除使用http请求发送的cookie的上游开销。显然,许多浏览器将与1个域/服务器的最大连接限制为6个并发。因此,如果你在差异服务器上有一个单独的域,你可以将其加倍到12.对我而言,这似乎是一个强大的速度提升的主要潜力。

尽管如此,如果我正确理解这一点。服务静态内容的另一个域需要位于主域的另一个服务器上。其实有道理,狂热的firefox用户和tweaker。当您在firefox中检查about:config设置时,默认情况下每个服务器的最大连接数设置为6。一个人可以手动将其提高到最多8.但是大多数firefox用户可能没有花足够的时间熟悉如何修改浏览器并将其保留为默认的最大值6。

不确定默认情况下设置了多少其他浏览器,然后还有旧的浏览器版本仍在使用中。 Bottomline ...非常有意义,使浏览器使用两台服务器连接的总数翻倍,这必须是加载时间的改进。在同一服务器上使用子域,一个人将无法利用它。

答案 3 :(得分:0)

我认为你可能会倒退,(或者我很可能)。为了澄清,如果您正在实施无cookie子域&至少在这种情况下,基本网址为www.,Cookie设置在www上,例如:主要的Cookie设置工具是google analytics,因此在我的网站上设置脚本时,它看起来像这样:

var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'analytics-acc-#],
['_setDomainName', '[www.valpocreative.com][1]'],
['_trackPageview']);

您可以在此处看到我将我的主域名设置为www,如果我错了,请更正我,我需要将www重定向到非www子域名&而不是相反。这也是cname设置的cpanel设置(cname= "cdn"指向www.domain.com