【问题标题】:Redirect to Subdir and preserve query string as is as part of filename重定向到 Subdir 并将查询字符串保留为文件名的一部分
【发布时间】:2021-12-30 09:00:21
【问题描述】:

我必须使用 .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(已找到)。

我有多个具有上述文件名结构的文件,无法“硬编码”它们,因为通过 CMS 更新和安装附加模块,我不知道将来各自目录中会存在哪些文件。

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

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

【问题讨论】:

    标签: apache .htaccess mod-rewrite


    【解决方案1】:

    使用您显示的示例/尝试,请尝试遵循 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]
    

    【讨论】:

    • 这只是一个样本。我有多个具有上述文件名结构的文件(JS,CSS,...)。我需要一个通用的解决方案来解决这个问题,因为将来通过更新 CMS 组件可以有更多/其他文件。
    • @Raphael,哦,好的,那么你能不能请公共 url,我可以通过它编写一个正则表达式来捕获东西,然后将它用于常见的规则等。
    • @Raphael,或者请尝试我的 OR 规则一次,让我知道结果如何。
    【解决方案2】:
    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(即文件fontawesome-webfont.woff2,查询字符串为@987654326 @,而不是名为 fontawesome-webfont.woff2?v=4.3.0.html 的文字文件)。您需要通过重写来维护 %-encoding 所以%3F 被重写为%3F,即。 /domain.de/fontawesome-webfont.woff2%3Fv=4.3.0.html(稍后在请求最终映射到文件系统时解码),而不是?(分隔实际查询字符串)。

    您可以通过使用反向引用(也是 %-decoded)捕获 URL 路径来做到这一点,但在重写请求之前使用重新编码反向引用的 B 标志。

    例如:

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

    【讨论】:

      猜你喜欢
      • 2011-07-16
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      • 2015-03-30
      • 2012-05-21
      • 2014-06-13
      • 2017-04-25
      • 2016-06-11
      相关资源
      最近更新 更多