diff --git a/CHANGES b/CHANGES
index 6f3cc30..39b71e6 100644
--- a/CHANGES
+++ b/CHANGES
@@ -10,7 +10,11 @@
 * Add support for the `loose` version of `query_param_matcher` via named argument `strict_match`.
 * Added support for `async/await` functions.
 * `response_callback` is no longer executed on exceptions raised by failed `Response`s
+* Change logic of `_get_url_and_path` to comply with RFC 3986. Now URL match occurs by matching
+  schema, authority and path, where path is terminated by the first question mark ("?") or
+  number sign ("#") character, or by the end of the URI.
 * An error is now raised when both `content_type` and `headers[content-type]` are provided as parameters.
+* When a request isn't matched the passthru prefixes are now included in error messages.
 
 
 0.18.0
diff --git a/responses/__init__.py b/responses/__init__.py
index 70c6260..94e0fae 100644
--- a/responses/__init__.py
+++ b/responses/__init__.py
@@ -38,7 +38,6 @@ from io import BytesIO
 from unittest import mock as std_mock
 from urllib.parse import parse_qsl
 from urllib.parse import quote
-from urllib.parse import urlparse
 from urllib.parse import urlsplit
 from urllib.parse import urlunparse
 from urllib.parse import urlunsplit
@@ -213,7 +212,7 @@ def _ensure_url_default_path(url):
 
 
 def _get_url_and_path(url):
-    url_parsed = urlparse(url)
+    url_parsed = urlsplit(url)
     url_and_path = urlunparse(
         [url_parsed.scheme, url_parsed.netloc, url_parsed.path, None, None, None]
     )
@@ -269,7 +268,7 @@ class BaseResponse(object):
         self.url = _ensure_url_default_path(url)
 
         if self._should_match_querystring(match_querystring):
-            match = tuple(match) + (_query_string_matcher(urlparse(self.url).query),)
+            match = tuple(match) + (_query_string_matcher(urlsplit(self.url).query),)
 
         self.match = match
         self.call_count = 0
@@ -309,7 +308,7 @@ class BaseResponse(object):
                 )
             return match_querystring_argument
 
-        return bool(urlparse(self.url).query)
+        return bool(urlsplit(self.url).query)
 
     def _url_matches(self, url, other):
         if isinstance(url, str):
@@ -744,7 +743,7 @@ class RequestsMock(object):
 
     def _parse_request_params(self, url):
         params = {}
-        for key, val in groupby(parse_qsl(urlparse(url).query), lambda kv: kv[0]):
+        for key, val in groupby(parse_qsl(urlsplit(url).query), lambda kv: kv[0]):
             values = list(map(lambda x: x[1], val))
             if len(values) == 1:
                 values = values[0]
@@ -784,6 +783,11 @@ class RequestsMock(object):
                     m.method, m.url, match_failed_reasons[i]
                 )
 
+            if self.passthru_prefixes:
+                error_msg += "Passthru prefixes:\n"
+                for p in self.passthru_prefixes:
+                    error_msg += "- {}\n".format(p)
+
             response = ConnectionError(error_msg)
             response.request = request
 

diff --git a/responses/test_responses.py b/responses/test_responses.py
index 3ddca9b..a656b83 100644
--- a/responses/test_responses.py
+++ b/responses/test_responses.py
@@ -1158,6 +1158,28 @@ def test_allow_redirects_samehost():
     assert_reset()
 
 
+def test_path_segments():
+    """Test that path segment after ``;`` is preserved.
+
+    Validate compliance with RFC 3986.
+    The path is terminated by the first question mark ("?") or
+    number sign ("#") character, or by the end of the URI.
+    See more about how path should be treated under:
+    https://datatracker.ietf.org/doc/html/rfc3986.html#section-3.3
+    """
+
+    @responses.activate
+    def run():
+        responses.add(responses.GET, "http://example.com/here/we", status=669)
+        responses.add(responses.GET, "http://example.com/here/we;go", status=777)
+
+        resp = requests.get("http://example.com/here/we;go")
+        assert resp.status_code == 777
+
+    run()
+    assert_reset()
+
+
 def test_handles_unicode_querystring():
     url = "http://example.com/test?type=2&ie=utf8&query=汉字"
 
@@ -1817,6 +1839,7 @@ def test_fail_request_error():
         with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps:
             rsps.add("POST", "http://example1.com")
             rsps.add("GET", "http://example.com")
+            rsps.add_passthru("http://other.example.com")
 
             with pytest.raises(ConnectionError) as excinfo:
                 requests.post("http://example.com", data={"id": "bad"})
@@ -1824,6 +1847,7 @@ def test_fail_request_error():
             msg = str(excinfo.value)
             assert "- POST http://example1.com/ URL does not match" in msg
             assert "- GET http://example.com/ Method does not match" in msg
+            assert "Passthru prefixes:\n- http://other.example.com" in msg
 
     run()
     assert_reset()

Path segment parameters not handled correctly
URL matching does not respect path segment parameters in the last path segment. This is probably caused by using `urlparse` instead of `urlsplit` in [_get_url_and_path](https://github.com/getsentry/responses/blob/a35896e9a1690730524c68d689ff1fde269d797a/responses/__init__.py#L215).

### Environment

Python 3.9
responses 0.18.0

### Steps to Reproduce

```
import responses
import requests

mock = responses.RequestsMock(assert_all_requests_are_fired=False)

mock.add(responses.GET, 'http://example.com/here/we')
mock.add(responses.GET, 'http://example.com/here/we;go')

request = requests.Request('GET', 'http://example.com/here/we;go').prepare()
print(mock._registry.find(request))
```

### Expected Result

Match the second mocked `CallbackResponse` with path segment parameter `go`.

### Actual Result

```
(<Response(url='http://example.com/here/we' status=200 content_type='text/plain' headers='null')>, [])
```


responses/test_responses.py::test_path_segments responses/test_responses.py::test_fail_request_error
responses/test_responses.py::test_response responses/test_responses.py::test_response_encoded responses/test_responses.py::test_response_with_instance responses/test_responses.py::test_replace[http://example.com/two-http://example.com/two] responses/test_responses.py::test_replace[original1-replacement1] responses/test_responses.py::test_replace[http://example\\.com/two-http://example\\.com/two] responses/test_responses.py::test_replace_error[http://example.com/one-http://example\\.com/one] responses/test_responses.py::test_replace_error[http://example\\.com/one-http://example.com/one] responses/test_responses.py::test_replace_response_object_error responses/test_responses.py::test_upsert_replace[http://example.com/two-http://example.com/two] responses/test_responses.py::test_upsert_replace[original1-replacement1] responses/test_responses.py::test_upsert_replace[http://example\\.com/two-http://example\\.com/two] responses/test_responses.py::test_upsert_add[http://example.com/two-http://example.com/two] responses/test_responses.py::test_upsert_add[original1-replacement1] responses/test_responses.py::test_upsert_add[http://example\\.com/two-http://example\\.com/two] responses/test_responses.py::test_remove responses/test_responses.py::test_response_equality[args10-kwargs10-args20-kwargs20-True] responses/test_responses.py::test_response_equality[args11-kwargs11-args21-kwargs21-False] responses/test_responses.py::test_response_equality[args12-kwargs12-args22-kwargs22-False] responses/test_responses.py::test_response_equality[args13-kwargs13-args23-kwargs23-True] responses/test_responses.py::test_response_equality_different_objects responses/test_responses.py::test_connection_error responses/test_responses.py::test_match_querystring responses/test_responses.py::test_match_querystring_empty responses/test_responses.py::test_match_querystring_error responses/test_responses.py::test_match_querystring_regex responses/test_responses.py::test_match_querystring_error_regex responses/test_responses.py::test_match_querystring_auto_activates responses/test_responses.py::test_match_querystring_missing_key responses/test_responses.py::test_accept_string_body responses/test_responses.py::test_accept_json_body responses/test_responses.py::test_no_content_type responses/test_responses.py::test_arbitrary_status_code responses/test_responses.py::test_throw_connection_error_explicit responses/test_responses.py::test_callback responses/test_responses.py::test_callback_deprecated_stream_argument responses/test_responses.py::test_callback_deprecated_match_querystring_argument responses/test_responses.py::test_callback_match_querystring_default_false responses/test_responses.py::test_callback_exception_result responses/test_responses.py::test_callback_exception_body responses/test_responses.py::test_callback_no_content_type responses/test_responses.py::test_callback_content_type_dict responses/test_responses.py::test_callback_matchers responses/test_responses.py::test_callback_matchers_fail responses/test_responses.py::test_callback_content_type_tuple responses/test_responses.py::test_regular_expression_url responses/test_responses.py::test_base_response_get_response responses/test_responses.py::test_custom_adapter responses/test_responses.py::test_responses_as_context_manager responses/test_responses.py::test_activate_doesnt_change_signature responses/test_responses.py::TestFixtures::test_function responses/test_responses.py::TestFixtures::test_function_decorated responses/test_responses.py::test_activate_mock_interaction responses/test_responses.py::test_activate_doesnt_change_signature_with_return_type responses/test_responses.py::test_activate_doesnt_change_signature_for_method responses/test_responses.py::test_response_cookies responses/test_responses.py::test_response_cookies_secure responses/test_responses.py::test_response_cookies_multiple responses/test_responses.py::test_response_cookies_session[True-True] responses/test_responses.py::test_response_cookies_session[True-False] responses/test_responses.py::test_response_cookies_session[True-None] responses/test_responses.py::test_response_cookies_session[False-True] responses/test_responses.py::test_response_cookies_session[False-False] responses/test_responses.py::test_response_cookies_session[False-None] responses/test_responses.py::test_response_cookies_session[None-True] responses/test_responses.py::test_response_cookies_session[None-False] responses/test_responses.py::test_response_cookies_session[None-None] responses/test_responses.py::test_response_callback responses/test_responses.py::test_response_filebody responses/test_responses.py::test_use_stream_twice_to_double_raw_io responses/test_responses.py::test_assert_all_requests_are_fired responses/test_responses.py::test_allow_redirects_samehost responses/test_responses.py::test_handles_unicode_querystring responses/test_responses.py::test_handles_unicode_url responses/test_responses.py::test_handles_unicode_body responses/test_responses.py::test_handles_buffered_reader_body responses/test_responses.py::test_headers responses/test_responses.py::test_content_length_error responses/test_responses.py::test_stream_with_none_chunk_size responses/test_responses.py::test_legacy_adding_headers responses/test_responses.py::test_legacy_adding_headers_with_content_type responses/test_responses.py::test_auto_calculate_content_length_string_body responses/test_responses.py::test_auto_calculate_content_length_bytes_body responses/test_responses.py::test_auto_calculate_content_length_json_body responses/test_responses.py::test_auto_calculate_content_length_unicode_body responses/test_responses.py::test_auto_calculate_content_length_doesnt_work_for_buffered_reader_body responses/test_responses.py::test_multiple_responses responses/test_responses.py::test_multiple_responses_intermixed responses/test_responses.py::test_multiple_urls responses/test_responses.py::test_multiple_methods responses/test_responses.py::test_passthrough_flag responses/test_responses.py::test_passthrough_response responses/test_responses.py::test_passthrough_response_stream responses/test_responses.py::test_passthru_prefixes responses/test_responses.py::test_passthru responses/test_responses.py::test_passthru_regex responses/test_responses.py::test_passthru_does_not_persist_across_tests responses/test_responses.py::test_method_named_param responses/test_responses.py::test_passthru_unicode responses/test_responses.py::test_custom_target responses/test_responses.py::test_cookies_from_headers responses/test_responses.py::test_request_param[http://example.com] responses/test_responses.py::test_request_param[http://example.com/some/path] responses/test_responses.py::test_request_param[http://example.com/other/path/] responses/test_responses.py::test_request_param_with_multiple_values_for_the_same_key responses/test_responses.py::test_assert_call_count[http://example.com] responses/test_responses.py::test_assert_call_count[http://example.com?hello=world] responses/test_responses.py::test_response_representations[response_params0-<Response(url='http://example.com/' responses/test_responses.py::test_response_representations[response_params1-<Response(url='http://another-domain.com/' responses/test_responses.py::test_response_representations[response_params2-<Response(url='http://abcd.com/' responses/test_responses.py::test_mocked_responses_list_registered responses/test_responses.py::test_rfc_compliance[http://service-A/foo?q=fizz-http://service-a/foo?q=fizz] responses/test_responses.py::test_rfc_compliance[http://service-a/foo-http://service-A/foo] responses/test_responses.py::test_rfc_compliance[http://someHost-AwAy/-http://somehost-away/] responses/test_responses.py::test_rfc_compliance[http://fizzbuzz/foo-http://fizzbuzz/foo] responses/test_responses.py::test_requests_between_add responses/test_responses.py::test_responses_reuse responses/test_responses.py::TestMultipleWrappers::test_wrapped responses/test_responses.py::TestMultipleWrappers::test_call_another_wrapped_function responses/test_responses.py::TestMultipleWrappers::test_mock_not_leaked