Ubuntu 18 Apache .htaccess通配符重写至其他目录(URL美化)问题
解决Apache重写规则的循环重定向问题
你的问题出在循环重定向上!让我给你拆解一下:
你写的规则 RewriteRule ^live/(.*)\.m3u8$ live/$1/index.m3u8 [NC] 会无限匹配下去:
- 当请求
https://eazita.com/live/xxx.m3u8时,规则会把它重写到live/xxx/index.m3u8 - 但这个新的URL
live/xxx/index.m3u8又会被规则匹配——因为(.*)会捕获到xxx/index,然后重写成live/xxx/index/index.m3u8 - 这个过程会一直重复,直到Apache触发内部重定向次数上限,就出现了你看到的
AH00124错误。
两种有效的解决方案
方案1:用原始请求判断(最可靠)
利用%{THE_REQUEST}变量,它记录的是浏览器发送的原始请求行,不会被内部重写修改。我们只针对原始的.m3u8请求进行重写:
RewriteEngine on # 只匹配原始的 GET 请求中 live/xxx.m3u8 的格式 RewriteCond %{THE_REQUEST} ^GET\ /live/([^\s]+)\.m3u8 # 添加 L 标志,告诉Apache这是最后一条要执行的规则 RewriteRule ^live/(.*)\.m3u8$ live/$1/index.m3u8 [NC,L]
方案2:检查文件是否存在
因为你实际要访问的是live/xxx/index.m3u8(这个文件存在),而请求的live/xxx.m3u8是不存在的,所以可以添加条件,只在请求的文件不存在时才执行重写:
RewriteEngine on # 当请求的文件不存在时才触发重写 RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^live/(.*)\.m3u8$ live/$1/index.m3u8 [NC,L]
为什么要加L标志?
L是Last的缩写,它会让Apache在执行完这条规则后停止处理后续的重写规则,避免不必要的匹配,也能进一步防止循环的可能。
测试一下这两个方案,应该就能解决你的问题了!
内容的提问来源于stack exchange,提问作者Hamza Iqbal
相关产品推荐
相关产品推荐

