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