diff --git a/whitenoise/responders.py b/whitenoise/responders.py
index c36c887..debedcc 100644
--- a/whitenoise/responders.py
+++ b/whitenoise/responders.py
@@ -167,8 +167,9 @@ class StaticFile(object):
         return alternatives
 
     def is_not_modified(self, request_headers):
-        if self.etag == request_headers.get('HTTP_IF_NONE_MATCH'):
-            return True
+        previous_etag = request_headers.get('HTTP_IF_NONE_MATCH')
+        if previous_etag is not None:
+            return previous_etag == self.etag
         try:
             last_requested = request_headers['HTTP_IF_MODIFIED_SINCE']
         except KeyError:

diff --git a/tests/test_whitenoise.py b/tests/test_whitenoise.py
index d186cc8..5bf70cd 100644
--- a/tests/test_whitenoise.py
+++ b/tests/test_whitenoise.py
@@ -102,6 +102,18 @@ class WhiteNoiseTest(TestCase):
         response = self.server.get(self.files.js_url, headers={'If-None-Match': etag})
         self.assertEqual(response.status_code, 200)
 
+    def test_etag_overrules_modified_since(self):
+        """
+        Browsers send both headers so it's important that the ETag takes precedence
+        over the last modified time, so that deploy-rollbacks are handled correctly.
+        """
+        headers = {
+            'If-None-Match': '"594bd1d1-36"',
+            'If-Modified-Since': 'Fri, 11 Apr 2100 11:47:06 GMT',
+        }
+        response = self.server.get(self.files.js_url, headers=headers)
+        self.assertEqual(response.status_code, 200)
+
     def test_max_age(self):
         response = self.server.get(self.files.js_url)
         self.assertEqual(response.headers['Cache-Control'], 'max-age=1000, public')

HTTP 304 being returned when Etag doesn't match
Hi!

Currently WhiteNoise:
* includes both an `Etag` and `Last-Modified` header on all responses
* checks incoming requests to see if they specified a `If-None-Match` (used for Etag) or `If-Modified-Since` header, to determine whether to return an HTTP 304 response

However the current implementation falls back to `If-Modified-Since` even if there was a non-matching `If-None-Match`, rather than returning false:
https://github.com/evansd/whitenoise/blob/1b5a7f3a0f151ee1449d88da9e4813644e435fd4/whitenoise/responders.py#L169-L176

This is problematic since:
* browsers (at least Firefox and Chrome, haven't checked the rest) always send both sets of headers
* `If-Modified-Since` is unreliable in the case of deployment rollbacks (since by design the comparison is greater than or equal to modified time, rather than just equal to)

Demo:

```bash
curl -I https://treeherder.mozilla.org/ \
  -H 'If-None-Match: "this-will-not-match"' \
  -H 'If-Modified-Since: Thu, 25 Oct 2099 16:00:44 GMT'
```

Currently this returns HTTP 304 even though it has a non-matching `If-None-Match` header value.

This caused frontend breakage after a rollback we performed today, which persisted until users force-refreshed:

----

![screenshot_2018-11-12 12 autoland](https://user-images.githubusercontent.com/501702/48365062-b6745300-e6a1-11e8-8dd9-cc37aa00d5d8.png)
tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_etag_overrules_modified_since tests/test_whitenoise.py::WhiteNoiseTest::test_etag_overrules_modified_since
tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_not_modified_future tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_custom_mimetype tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_add_under_prefix tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_out_of_range_error tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_not_modified_exact tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_response_has_correct_content_length_header tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_other_requests_passed_through tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_post_request_returns_405 tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_no_error_on_very_long_filename tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_etag_matches tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_get_file tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_response_has_allow_origin_header tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_request_trailing_bytes tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_non_ascii_requests_safely_ignored tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_request_initial_bytes tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_directory_path_without_trailing_slash_redirected tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_max_age tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_get_not_accept_gzip tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_request_middle_bytes tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_index_file_served_at_directory_path tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_custom_headers tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_modified tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_head_request_has_no_body tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_overlong_ranges_truncated tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_handles_missing_path_info_key tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_etag_doesnt_match tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_get_accept_gzip tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_cannot_directly_request_gzipped_file tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_gzip_response_has_correct_content_length_header tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_warn_about_missing_directories tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_overlong_trailing_ranges_return_entire_file tests/test_whitenoise.py::WhiteNoiseAutorefresh::test_index_file_path_redirected tests/test_whitenoise.py::WhiteNoiseTest::test_overlong_ranges_truncated tests/test_whitenoise.py::WhiteNoiseTest::test_out_of_range_error tests/test_whitenoise.py::WhiteNoiseTest::test_etag_doesnt_match tests/test_whitenoise.py::WhiteNoiseTest::test_get_accept_gzip tests/test_whitenoise.py::WhiteNoiseTest::test_head_request_has_no_body tests/test_whitenoise.py::WhiteNoiseTest::test_response_has_correct_content_length_header tests/test_whitenoise.py::WhiteNoiseTest::test_post_request_returns_405 tests/test_whitenoise.py::WhiteNoiseTest::test_not_modified_future tests/test_whitenoise.py::WhiteNoiseTest::test_response_has_allow_origin_header tests/test_whitenoise.py::WhiteNoiseTest::test_request_trailing_bytes tests/test_whitenoise.py::WhiteNoiseTest::test_overlong_trailing_ranges_return_entire_file tests/test_whitenoise.py::WhiteNoiseTest::test_non_ascii_requests_safely_ignored tests/test_whitenoise.py::WhiteNoiseTest::test_etag_matches tests/test_whitenoise.py::WhiteNoiseTest::test_other_requests_passed_through tests/test_whitenoise.py::WhiteNoiseTest::test_index_file_path_redirected tests/test_whitenoise.py::WhiteNoiseTest::test_index_file_served_at_directory_path tests/test_whitenoise.py::WhiteNoiseTest::test_get_not_accept_gzip tests/test_whitenoise.py::WhiteNoiseTest::test_directory_path_without_trailing_slash_redirected tests/test_whitenoise.py::WhiteNoiseTest::test_warn_about_missing_directories tests/test_whitenoise.py::WhiteNoiseTest::test_add_under_prefix tests/test_whitenoise.py::WhiteNoiseTest::test_request_middle_bytes tests/test_whitenoise.py::WhiteNoiseTest::test_gzip_response_has_correct_content_length_header tests/test_whitenoise.py::WhiteNoiseTest::test_handles_missing_path_info_key tests/test_whitenoise.py::WhiteNoiseTest::test_cannot_directly_request_gzipped_file tests/test_whitenoise.py::WhiteNoiseTest::test_custom_mimetype tests/test_whitenoise.py::WhiteNoiseTest::test_get_file tests/test_whitenoise.py::WhiteNoiseTest::test_request_initial_bytes tests/test_whitenoise.py::WhiteNoiseTest::test_max_age tests/test_whitenoise.py::WhiteNoiseTest::test_not_modified_exact tests/test_whitenoise.py::WhiteNoiseTest::test_modified tests/test_whitenoise.py::WhiteNoiseTest::test_custom_headers tests/test_whitenoise.py::WhiteNoiseUnitTests::test_directory_path_can_be_pathlib_instance tests/test_whitenoise.py::WhiteNoiseUnitTests::test_immutable_file_test_accepts_regex