Regex 将不以映像扩展名结尾的子域请求重定向到主域(htaccess)

Regex 将不以映像扩展名结尾的子域请求重定向到主域(htaccess),regex,.htaccess,Regex,.htaccess,我有一个子域打算在某个时候用于CDN:images.example.com。该子域上的请求应类似于http://images.example.com/path/to/some/image.jpg。但目前,所有内容仍托管在同一台服务器上,服务器配置为使用images.example.com作为example.com的别名 这样,两个请求都可以工作: http://images.example.com/path/to/some/image.jpg http://example.com/path/to

我有一个子域打算在某个时候用于CDN:
images.example.com
。该子域上的请求应类似于
http://images.example.com/path/to/some/image.jpg
。但目前,所有内容仍托管在同一台服务器上,服务器配置为使用
images.example.com
作为
example.com
的别名

这样,两个请求都可以工作:
http://images.example.com/path/to/some/image.jpg
http://example.com/path/to/some/image.jpg

但其他有效请求也将在子域和tld上解决:
http://example.com/blog/post/Some-Interesting-Non-Image-Content
http://images.example.com/blog/post/Some-Interesting-Non-Image-Content

让我们假设,如果图像是流式传输的,那么URL将具有图像扩展名。我想为
.htaccess
编写一个重写条件/规则,将
images.example.com
上的所有请求重定向到
example.com
,这些请求不会以图像扩展名
结尾(\.gif\.png\.jpeg\.jpg)
example.com
。我也希望有相反的规则。如果带有
(\.gif\.png\.jpeg\.jpg)
的请求到达
example.com
-将其重定向到
images.example.com

我尝试了几种方法,但似乎都失败了(我在计算.htaccess正则表达式时遇到了问题):


%{HTTP_HOST}
变量只包含主机名,因为它是在HTTP“HOST”请求头中传输的。因此,您不能尝试匹配其中的请求URI之类的内容。您可以在
RewriteRule
中的正则表达式模式中或针对
%{REQUEST\u URI}
变量执行此操作。尝试:

RewriteEngine On

RewriteCond %{HTTP_HOST} ^images\.example\.com$ [NC]
RewriteRule !\.(jpe?g|gif|ico|png)$ http://www.example.com%{REQUEST_URI} [R=301,L,NC]

RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
RewriteRule \.(jpe?g|gif|ico|png)$ http://images.example.com%{REQUEST_URI} [R=301,L,NC]

NC
标志表示匹配不区分大小写。

除了一种情况外,此功能非常有效-如果我有一个类似/search?Vehicles%5BMakeID%5D=46(Vehicles[MakeID]=46)的链接,它将在从.htaccess重定向时停止链接。这背后的原因是什么?@Veseliq不应该。尝试在重写规则(方括号内)中添加
NE
标志。谢谢,你太棒了!:)嘿-现在我看到,虽然它似乎适用于大多数情况,但在某些情况下似乎失败了:我不知道为什么,对于像它这样的简单图像,如果url不以png | jpe?g | gif结尾,它肯定会重定向到主域。我稍后会调试,现在将删除重写条件。
RewriteEngine On

RewriteCond %{HTTP_HOST} ^images\.example\.com$ [NC]
RewriteRule !\.(jpe?g|gif|ico|png)$ http://www.example.com%{REQUEST_URI} [R=301,L,NC]

RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
RewriteRule \.(jpe?g|gif|ico|png)$ http://images.example.com%{REQUEST_URI} [R=301,L,NC]