重定向至"细分曲面"诊断树,并将查询字符串保留为文件名的一部分



我必须使用.htaccess将域重定向到子文件夹

RewriteCond %{HTTP_HOST} ^(www.)?domain.de$ [NC]
RewriteRule !^domain.de/ /domain.de%{REQUEST_URI} [L,NC]

这适用于我的网站的90%。

但我也有文件参考,如:

domain.de/templates/shaper_helix3/fonts/fontawesome-webfont.woff2%3Fv=4.3.0.html

文件存在于文件系统中,文件名为:fontawesome-webfont.woff2?v=4.3.0.html(包括查询字符串(

这些文件当前未找到(404(。如果我手动从文件名中删除查询字符串(例如,导致fontawesome-webfont.woff2(,我会得到一个HTTP代码200(Found(。

我有多个具有所述文件名结构的文件;硬编码";他们,因为通过CMS更新和安装额外的模块,我不知道哪些文件将来会存在于相应的目录中。

文件名称中包含查询字符串/版本的原因是缓存破坏。

我必须如何修改我的规则,以便也可以找到这些文件?

使用您显示的示例/尝试,请尝试以下htaccess规则。这些规则适用于内部重写规则。

请确保在测试URL之前清除浏览器缓存。

RewriteEngine ON
RewriteRule ^(templates/shaper_helix3/fonts/fontawesome-webfont.woff2)%3F(v=4.3.0.html)/?$ $1?$2 [QSA,NC,L]

或者如果它可以是templates/shaper_helix3/fonts/fontawesomefont/下的任何文件,则尝试以下操作:

RewriteEngine ON
RewriteRule ^(templates/shaper_helix3/fonts/[^%]*)%3F(v=4.3.0.html)/?$ $1?$2 [QSA,NC,L]
RewriteCond %{HTTP_HOST} ^(www.)?domain.de$ [NC]
RewriteRule !^domain.de/ /domain.de%{REQUEST_URI} [L,NC]

;"问题";这里的REQUEST_URI服务器变量已经被%解码,因此最终将对/fontawesome-webfont.woff2%3Fv=4.3.0.html的请求重写为/domain.de/fontawesome-webfont.woff2?Fv=4.3.0.html(即查询字符串为v=4.3.0.html的文件fontawesome-webfont.woff2,而不是名为fontawesome-webfont.woff2?v=4.3.0.html的文本文件(。您需要通过重写来维护%-编码,以便%3F被重写为%3F,即/domain.de/fontawesome-webfont.woff2%3Fv=4.3.0.html(稍后在请求最终映射到文件系统时对其进行解码(,而不是?(定义实际查询字符串(。

您可以通过使用backreference(也是%-decoded(捕获URL路径来实现这一点,但在重写请求之前使用B标志对backreference进行重新编码。

例如:

RewriteCond %{HTTP_HOST} ^(www.)?domain.de$ [NC]
RewriteCond %{REQUEST_URI} !^/domain.de/ [NC]
RewriteRule (.*) domain.de/$1 [B,L]

最新更新