Apache重写从原始请求URL中提取多个数据片段

尝试创build一个仅适用于video文件的Apache重写,直到专用的video服务Web服务器。

它需要重写逻辑从原始请求中提取多个信息,包括HTTP_HOST域名,request_uri和目标文件types。 我在寻求帮助和build议方面做了很多工作,经历了大量的试错……只能接近,似乎无法100%正确。 这是我想要完成的:

传入url示例:

 https://www.example1.com/images/source/vidtest.mp4 

预定的着陆URL:

 https://www.webvideo.com/example1_video/images/source/vidtest.mp4 

因此,一个redirect仅适用于以video文件扩展名types(例如.mp4 )结尾的请求,该types仅提取传入的域名(不是前导www ,或者来自原始HTTP_HOST的尾随.com ),并提取剩余的URI ….并将其redirect到一个新的networking服务器,放入一个以原始主机域名命名的video文件夹(例如example1 ),然后是_video ,然后是附加的原始URI的剩余部分。

这里是我现在有的redirect逻辑:

 RewriteCond %{HTTP_HOST} ^www\.[^.]+\.com$ RewriteCond %{REQUEST_URI} \.(mp4|mp3|mov|mpg|mpeg|webm|wmv|ogg)$ [NC] RewriteRule ^/(.*)$ https://www.webvideo.com/%1_video/$1 [R=301,NC,L,NE] 

这似乎是正确的工作,只拿起这些video文件扩展名types之一传入的请求,它正确地redirect到预期的目标www.webvideo.com域,它也正确地附加后面的URI( $1variables)。 但不幸的是,它将input文件types(如mp4 )放在_video之前的%1variables位置,而不是原始域名。 所以这个例子传入的请求导致redirect到这个:

 https://www.webvideo.com/mp4_video/images/source/vidtest.mp4 

有人可以提出一个更正吗? 我需要做些什么才能将原始域名作为variables存入新的文件夹path中,AND是否只将redirect应用于video文件types,并将尾部URI的其余部分也包含在内? 请注意,将有多个不同域的传入请求(这就是为什么需要为新文件夹path提取域名的原因),这些请求都将被redirect到同一个单独的web服务apache目标。

你非常接近你喜欢的东西,你只是想念()

 RewriteCond %{HTTP_HOST} ^www\.([^.]+)\.com$ RewriteCond %{REQUEST_URI} \.(mp4|mp3|mov|mpg|mpeg|webm|wmv|ogg)$ [NC] RewriteRule ^/(.*)$ https://www.webvideo.com/%1_video/$1 [R=301,NC,L,NE] 

重点是%1指在您的重写条件中的第一个捕获组。 捕获组在()之间,在这种情况下,这是URI扩展(mp4|mp3|mov|mpg|mpeg|webm|wmv|ogg) 。 在主机条件中添加一个新的捕获组会给你两个捕获组,但是对于你的重写规则,你只需要第一个捕获组。

一个额外的备注:这只适用于主域名,没有比www更多的子域名,如果你拥有像www.video.example.com这样的FQDN,它将不起作用。

编辑:

第一个代码示例基本上只关注主要问题,但正如命令中提到的那样,可以优化孔重写规则。

 RewriteCond %{HTTP_HOST} ^www\.([^.]+)\.com$ [NC] RewriteRule ^/?(.*\.(mp4|mp3|mov|mpg|mpeg|webm|wmv|ogg))$ https://www.webvideo.com/%1_video/$1 [R=301,NC,L,NE]