我必须使用.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]