You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 18 Apache .htaccess通配符重写至其他目录(URL美化)问题

解决Apache重写规则的循环重定向问题

你的问题出在循环重定向上!让我给你拆解一下:

你写的规则 RewriteRule ^live/(.*)\.m3u8$ live/$1/index.m3u8 [NC] 会无限匹配下去:

  1. 当请求 https://eazita.com/live/xxx.m3u8 时,规则会把它重写到 live/xxx/index.m3u8
  2. 但这个新的URL live/xxx/index.m3u8 又会被规则匹配——因为 (.*) 会捕获到 xxx/index,然后重写成 live/xxx/index/index.m3u8
  3. 这个过程会一直重复,直到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 08:02:40