Php 如何处理http2推送和子目录?

Php 如何处理http2推送和子目录?,php,apache,.htaccess,http2,server-push,Php,Apache,.htaccess,Http2,Server Push,我一直在开发一个具有以下结构的网站 主站点+htaccess Fr子目录(法语) En子目录(英文版) 图像、js和css的资产子目录 htaccess包含一个http2服务器推送,如下所示: <IfModule http2_module> SetEnvIf Cookie "cssloaded=1" cssloaded <filesMatch "\.([hH][tT][mM][lL]?)"> Header add Link "<assets/base/css

我一直在开发一个具有以下结构的网站

  • 主站点+htaccess
    • Fr子目录(法语)
    • En子目录(英文版)
    • 图像、js和css的资产子目录
htaccess包含一个http2服务器推送,如下所示:

<IfModule http2_module>
SetEnvIf Cookie "cssloaded=1" cssloaded
<filesMatch "\.([hH][tT][mM][lL]?)">
Header add Link "<assets/base/css/style.css>;rel=preload;as=style" env=!cssloaded
Header add Set-Cookie "cssloaded=1; Path=/; Secure; HttpOnly" env=!cssloaded
</filesMatch>

SetEnvIf Cookie“cssloaded=1”cssloaded
标题添加链接“rel=preload;as=style”env=!cssloaded
标题添加集Cookie“cssloaded=1;Path=/;Secure;HttpOnly”env=!cssloaded

问题是服务器在法语和英语子目录中也推送style.css,导致404(然后在不推送服务器的情况下继续加载正确的样式,即../assets/base/css/style.css)


如何避免这种情况,或者(最好)在所有目录中推送文件,但要指向正确的文件?

您推送的是相对路径样式表:

Header add Link "<assets/base/css/style.css>;rel=preload;as=style" env=!cssloaded
标题添加链接“rel=preload;as=style”env=!cssloaded
为什么不推一个绝对的呢

Header add Link "</assets/base/css/style.css>;rel=preload;as=style" env=!cssloaded
标题添加链接“rel=preload;as=style”env=!cssloaded
或者,使用location或locationMatch代替fileMatch:

<locationMatch "^/$">
Header add Link "<assets/base/css/style.css>;rel=preload;as=style" env=!cssloaded
Header add Set-Cookie "cssloaded=1; Path=/; Secure; HttpOnly" env=!cssloaded
</locationMatch>
<locationMatch "^/en/$">
Header add Link "<../assets/base/css/style.css>;rel=preload;as=style" env=!cssloaded
Header add Set-Cookie "cssloaded=1; Path=/; Secure; HttpOnly" env=!cssloaded
</locationMatch>
<locationMatch "^/fr/$">
Header add Link "<../assets/base/css/style.css>;rel=preload;as=style" env=!cssloaded
Header add Set-Cookie "cssloaded=1; Path=/; Secure; HttpOnly" env=!cssloaded
</locationMatch>

标题添加链接“rel=preload;as=style”env=!cssloaded
标题添加集Cookie“cssloaded=1;Path=/;Secure;HttpOnly”env=!cssloaded
标题添加链接“rel=preload;as=style”env=!cssloaded
标题添加集Cookie“cssloaded=1;Path=/;Secure;HttpOnly”env=!cssloaded
标题添加链接“rel=preload;as=style”env=!cssloaded
标题添加集Cookie“cssloaded=1;Path=/;Secure;HttpOnly”env=!cssloaded

不幸的是,它位于htaccess中,因此locationmatch无法工作。。。我没有想到的绝对路径,但担心它需要额外的查找(否定了服务器推送的速度优势),但这是个好主意。我来测试一下谢谢!为什么它需要额外的查找?你是绝对正确的,事实并非如此。顺便说一句,绝对路径的建议是完美的。谢谢没问题。我想您是从我的博客帖子()中获取的,因为配置看起来很熟悉:-),所以检查了它,它有绝对路径,所以我猜是复制粘贴错误!