htaccess URL 指纹识别

htaccess URL fingerprinting

有没有一种方法可以使用 mod_rewrite 和 htaccess 实现 URL 指纹识别,而无需在每次更新时更改文件名?

这是服务器上的文件结构(无关文件省略):

/apps
    /foo
        /public
            /js
                file1.min.js
                file2.min.js
            /css
                file1.css
                file2.css
    /bar
        /public
            /js
                file1.min.js
                file2.min.js
            /css
                file1.css
                file2.css

我的页面在应用程序文件夹中。我页面中的 <script> 个元素目前看起来像这样:

<script src='public/js/file1.min.js'></script>
<script src='public/js/file2.min.js'></script>

我想实现 URL fingerprinting 所以我的元素看起来像这样:

<script src='public/js/file1.1a516fba.min.js' integrity='sha384-...'></script>
<script src='public/js/file2.faf315f3.min.js' integrity='sha384-...'></script>

我每次都可以通过更改文件名进行部署,但我想知道是否有更简单的方法。

我在我的 .htaccess 文件中试过 apps:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^public/(css|js)/(.*)\.[0-9]+(\.css|\.js)$ /public//. [L, QSA]
</IfModule>

这没有用。我也尝试了它的变体,要么以 HTTP 500(完全失败)或 404(规则无效)结束。

我想尽可能避免在每个应用程序的文件夹中重复 .htaccess,并且我想将该文件保留在源代码管理中(所以在 /apps 中)。

您试图通过仅允许数字来捕获 faf315f3 - 这就是问题所在。您还需要包括 alpha:

RewriteRule ^public/(css|js)/([^.]+).[0-9a-z]+((?:.min)?.(?:css|js))$ /public// [NC,QSA,L]

此外,我对您的规则做了一些改进:

  1. 您无需在规则中转义句点 - 这些仅在条件中需要。
  2. 对第二个捕获组使用 [^.]+(任何不是句号的东西)而不是 .*(任何东西,零长度及以上)。
  3. 将句点移到最后一个 css|js 捕获之外,因为捕获会在目标 URI 中复制它。
  4. 捕获文件扩展名的整个组,并使 .min 可选。这也意味着删除目标 URI 中的句点,导致 /.