diff --git a/middleman-core/features/asset_hash.feature b/middleman-core/features/asset_hash.feature
index 78755818..0a05c1a6 100644
--- a/middleman-core/features/asset_hash.feature
+++ b/middleman-core/features/asset_hash.feature
@@ -203,6 +203,45 @@ Feature: Assets get file hashes appended to them and references to them are upda
| javascripts/application-1d8d5276.js |
| stylesheets/site-7474cadd.css |
+ Scenario: Hashed-asset files are not replaced for rewrite ignored paths
+ Given a fixture app "asset-hash-app"
+ And a file named "config.rb" with:
+ """
+ is_stylesheet = proc { |path| path.start_with? '/stylesheets' }
+ activate :asset_hash, rewrite_ignore: [
+ %r(javascripts/*),
+ '/subdir/*',
+ is_stylesheet
+ ]
+ activate :relative_assets
+ activate :directory_indexes
+ """
+ And a successfully built app at "asset-hash-app"
+ When I cd to "build"
+ Then the following files should exist:
+ | index.html |
+ | subdir/index.html |
+ | images/100px-5fd6fb90.jpg |
+ | javascripts/application-1d8d5276.js |
+ | stylesheets/site-8bc55985.css |
+ And the following files should not exist:
+ | images/100px.jpg |
+ | javascripts/application.js |
+ | stylesheets/site.css |
+ And the file "javascripts/application-1d8d5276.js" should contain "img.src = '/images/100px.jpg'"
+ And the file "stylesheets/site-8bc55985.css" should contain:
+ """
+ background-image: url("../images/100px.jpg")
+ """
+ And the file "index.html" should contain 'href="stylesheets/site-8bc55985.css"'
+ And the file "index.html" should contain 'src="javascripts/application-1d8d5276.js"'
+ And the file "index.html" should contain 'src="images/100px-5fd6fb90.jpg"'
+ And the file "subdir/index.html" should contain:
+ """
+
Image url3:
+ ![](../images/100px.jpg)
+ """
+
Scenario: Already minified files should still be hashed
Given a successfully built app at "asset-hash-minified-app"
When I cd to "build"
diff --git a/middleman-core/lib/middleman-core/extensions/asset_hash.rb b/middleman-core/lib/middleman-core/extensions/asset_hash.rb
index 8b9b606b..da84a23d 100644
--- a/middleman-core/lib/middleman-core/extensions/asset_hash.rb
+++ b/middleman-core/lib/middleman-core/extensions/asset_hash.rb
@@ -5,6 +5,7 @@ require 'middleman-core/rack'
class Middleman::Extensions::AssetHash < ::Middleman::Extension
option :exts, %w(.jpg .jpeg .png .gif .webp .js .css .otf .woff .woff2 .eot .ttf .svg .svgz), 'List of extensions that get asset hashes appended to them.'
option :ignore, [], 'Regexes of filenames to skip adding asset hashes to'
+ option :rewrite_ignore, [], 'Regexes of filenames to skip processing for path rewrites'
def initialize(app, options_hash={}, &block)
super
@@ -23,6 +24,7 @@ class Middleman::Extensions::AssetHash < ::Middleman::Extension
url_extensions: options.exts.sort.reverse,
source_extensions: %w(.htm .html .php .css .js),
ignore: @ignore,
+ rewrite_ignore: options.rewrite_ignore,
middleman_app: app,
proc: method(:rewrite_url)
end
diff --git a/middleman-core/lib/middleman-core/middleware/inline_url_rewriter.rb b/middleman-core/lib/middleman-core/middleware/inline_url_rewriter.rb
index 34312060..b76c3285 100644
--- a/middleman-core/lib/middleman-core/middleware/inline_url_rewriter.rb
+++ b/middleman-core/lib/middleman-core/middleware/inline_url_rewriter.rb
@@ -34,13 +34,16 @@ module Middleman
@source_exts_regex_text = Regexp.union(@source_exts).to_s
@ignore = options.fetch(:ignore)
+ @rewrite_ignore = Array(options.fetch(:rewrite_ignore, []))
end
def call(env)
status, headers, response = @rack_app.call(env)
- # Allow upstream request to skip all rewriting
- return [status, headers, response] if env['bypass_inline_url_rewriter'] == 'true'
+ # Allow configuration or upstream request to skip all rewriting
+ if rewrite_ignore?(env['PATH_INFO']) || env['bypass_inline_url_rewriter'] == 'true'
+ return [status, headers, response]
+ end
# Allow upstream request to skip this specific rewriting
if @uid
@@ -96,6 +99,11 @@ module Middleman
false
end
end
+
+ Contract String => Bool
+ def rewrite_ignore?(path)
+ @rewrite_ignore.any? { |ignore| Middleman::Util.path_match(ignore, path) }
+ end
end
end
end