2016-04-19 93 views
1

有沒有辦法使用mod_rewrite和htaccess實現URL指紋,而不必更改每個更新的文件名?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/$1/$2.$3 [L, QSA] 
</IfModule> 

這沒有奏效。我也嘗試過它的變體,並以HTTP 500(完全失敗)或404(規則不起作用)結束。

我想避免在每個應用程序的文件夾中重複使用.htaccess,如果可能的話,我想將源文件保存在源代碼控制中(因此在/apps之內)。

回答

1

您試圖通過只允許數字來捕獲faf315f3 - 這是問題所在。您需要包括阿爾法以及:

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

此外,我做了一些改進您的規則:

  1. 你不必逃避規則的時期 - 這是唯一需要的條件。
  2. 對第二個捕獲組使用[^.]+(任何不是週期的)而不是.*(任何東西,長度爲零)。
  3. 移動最後的css|js捕獲之外的時間段,因爲捕獲將在目標URI中複製它。
  4. 捕獲文件擴展名的整個組,並使.min可選。這也意味着刪除目標URI中的句點,導致$1/$2$3
+1

謝謝!我做了一些修改,以允許散列是可選的,'.min'也不應該是可選的。 –