它需要重写逻辑,从原始请求中提取多条信息,包括HTTP_HOST域名,request_uri和目标文件类型.我已经做了大量的寻求帮助和建议,并经历了大量的试验 – 并且 – 恐怖……并且只是接近了,似乎无法100%正确.这是我想要完成的事情:
传入URL示例:
https://www.example1.com/images/source/vidtest.mp4
目标着陆网址:
https://www.webvideo.com/example1_video/images/source/vidtest.mp4
因此,重定向仅适用于以视频文件扩展名类型(例如.mp4)结尾的请求,它仅提取传入域名(不是前导www,或原始HTTP_HOST中的尾随.com),并提取剩余的URI ….并将其重定向到新的Web服务器,进入一个视频文件夹,该文件夹以原始主机域名(例如example1)命名,后跟_video,然后附加整个原始URI的其余部分.
这是我目前的重定向逻辑:
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]
它似乎正常工作,只接收其中一个视频文件扩展类型的传入请求,并且它正确地重定向到目标目标www.webvideo.com域,并且它也正确附加了尾随URI($1变量).但不幸的是,它将传入的文件类型(例如mp4)放在_video之前的%1变量位置,而不是原始域名.因此,示例传入请求导致重定向到此:
https://www.webvideo.com/mp4_video/images/source/vidtest.mp4
有人可以建议更正?我需要做些什么才能将原始域名作为变量并进入新文件夹路径,并且重定向仅适用于视频文件类型,并且还会继承其余的尾随URI?请注意,将有多个不同域的传入请求(这就是为什么需要为新文件夹路径提取域名的原因!),这些将全部重定向到同一个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,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,NE]