Apache RewriteCond在HTTP虚拟主机生效HTTPS主机失效问题求助
根因分析
- Referer头不可靠,HTTPS场景下传递受限
浏览器默认Referrer-Policy为strict-origin-when-cross-origin,再叠加Kerberos认证、浏览器扩展、安全配置等影响,HTTPS站点的Referer头很容易被截断、清空,导致你原配置中基于%{HTTP_REFERER}的判断条件完全失效,触发重定向循环。
- Referer头不可靠,HTTPS场景下传递受限
- 你尝试的REQUEST_URI规则存在语法错误
Apache mod_rewrite的匹配规则默认使用正则语法,你写的!viewer.html*中*是正则量词,代表匹配前面的l字符0次或多次,并非通配符,因此规则无法匹配到含viewer.html的路径,判断条件不生效。
- 你尝试的REQUEST_URI规则存在语法错误
- 301永久重定向缓存干扰测试
你原配置使用R=301永久重定向,浏览器会长期缓存该规则,即使你修改了服务端配置,未清除本地缓存的情况下依然会执行旧的重定向逻辑,看起来像配置不生效。
- 301永久重定向缓存干扰测试
修复方案
优先弃用不可靠的Referer判断逻辑,直接通过请求路径过滤PDF.js相关资源,从根源避免循环:
- 修改虚拟主机的重写规则如下:
RewriteEngine On # 排除PDF.js目录下的所有请求,完全避免循环 RewriteCond %{REQUEST_URI} !^/libs/mozilla\.pdf\.js/ [NC] # 匹配所有.pdf后缀的请求,拼接完整路径传递给viewer RewriteRule ^(.+\.pdf)$ https://server-prod.local/libs/mozilla.pdf.js/web/viewer.html?file=/$1 [R=302,L,NC]
说明:先用
R=302临时重定向测试,确认规则生效后再改为R=301避免缓存问题;NC代表忽略大小写,匹配.PDF等大写后缀的文件。
- 清除浏览器301缓存
可以通过Ctrl+Shift+R强制硬刷新站点,或者在浏览器设置中清除对应站点的历史数据、缓存文件,避免旧的重定向规则干扰。 - 验证Kerberos认证配置
确保/libs/mozilla.pdf.js目录允许公共访问(不需要登录就能加载viewer的静态资源),PDF存储目录的Kerberos认证规则正常,避免PDF请求被认证拦截返回HTML页面,导致invalid PDF structure报错。
内容的提问来源于stack exchange,提问作者StartedFromTheBottom
相关产品推荐
相关产品推荐

