diff --git a/http/http_connection.hpp b/http/http_connection.hpp
index 0daf665..c28cde3 100644
--- a/http/http_connection.hpp
+++ b/http/http_connection.hpp
@@ -25,7 +25,6 @@
 #include <boost/beast/http/write.hpp>
 #include <boost/beast/ssl/ssl_stream.hpp>
 #include <boost/beast/websocket.hpp>
-#include <boost/url/url_view.hpp>
 
 #include <atomic>
 #include <chrono>
@@ -225,12 +224,14 @@
         }
         keepAlive = thisReq.keepAlive();
 #ifndef BMCWEB_INSECURE_DISABLE_AUTHX
-        if (!crow::authentication::isOnAllowlist(req->url, req->method()) &&
+        if (!crow::authentication::isOnAllowlist(req->url().buffer(),
+                                                 req->method()) &&
             thisReq.session == nullptr)
         {
             BMCWEB_LOG_WARNING << "Authentication failed";
             forward_unauthorized::sendUnauthorized(
-                req->url, req->getHeaderValue("X-Requested-With"),
+                req->url().encoded_path(),
+                req->getHeaderValue("X-Requested-With"),
                 req->getHeaderValue("Accept"), res);
             completeRequest(res);
             return;
@@ -307,8 +308,9 @@
         res = std::move(thisRes);
         res.keepAlive(keepAlive);
 
-        BMCWEB_LOG_INFO << "Response: " << this << ' ' << req->url << ' '
-                        << res.resultInt() << " keepalive=" << keepAlive;
+        BMCWEB_LOG_INFO << "Response: " << this << ' '
+                        << req->url().encoded_path() << ' ' << res.resultInt()
+                        << " keepalive=" << keepAlive;
 
         addSecurityHeaders(*req, res);
 
diff --git a/http/http_request.hpp b/http/http_request.hpp
index e59f84b..3fd9d4d 100644
--- a/http/http_request.hpp
+++ b/http/http_request.hpp
@@ -8,7 +8,7 @@
 #include <boost/beast/http/message.hpp>
 #include <boost/beast/http/string_body.hpp>
 #include <boost/beast/websocket.hpp>
-#include <boost/url/url_view.hpp>
+#include <boost/url/url.hpp>
 
 #include <string>
 #include <string_view>
@@ -20,9 +20,11 @@
 struct Request
 {
     boost::beast::http::request<boost::beast::http::string_body> req;
-    std::string_view url{};
-    boost::urls::url_view urlView{};
 
+  private:
+    boost::urls::url urlBase{};
+
+  public:
     bool isSecure{false};
 
     boost::asio::io_context* ioService{};
@@ -49,21 +51,8 @@
         }
     }
 
-    Request(const Request& other) :
-        req(other.req), isSecure(other.isSecure), ioService(other.ioService),
-        ipAddress(other.ipAddress), session(other.session),
-        userRole(other.userRole)
-    {
-        setUrlInfo();
-    }
-
-    Request(Request&& other) noexcept :
-        req(std::move(other.req)), isSecure(other.isSecure),
-        ioService(other.ioService), ipAddress(std::move(other.ipAddress)),
-        session(std::move(other.session)), userRole(std::move(other.userRole))
-    {
-        setUrlInfo();
-    }
+    Request(const Request& other) = default;
+    Request(Request&& other) = default;
 
     Request& operator=(const Request&) = delete;
     Request& operator=(const Request&&) = delete;
@@ -94,6 +83,11 @@
         return req.target();
     }
 
+    boost::urls::url_view url() const
+    {
+        return {urlBase};
+    }
+
     const boost::beast::http::fields& fields() const
     {
         return req.base();
@@ -134,8 +128,7 @@
         {
             return false;
         }
-        urlView = *result;
-        url = urlView.encoded_path();
+        urlBase = *result;
         return true;
     }
 };
diff --git a/http/routing.hpp b/http/routing.hpp
index 736ec38..5ebc11f 100644
--- a/http/routing.hpp
+++ b/http/routing.hpp
@@ -1218,7 +1218,8 @@
             // Make sure it's safe to deference the array at that index
             static_assert(maxVerbIndex <
                           std::tuple_size_v<decltype(perMethods)>);
-            FindRoute route = findRouteByIndex(req.url, perMethodIndex);
+            FindRoute route =
+                findRouteByIndex(req.url().encoded_path(), perMethodIndex);
             if (route.rule == nullptr)
             {
                 continue;
@@ -1251,11 +1252,13 @@
         Trie& trie = perMethod.trie;
         std::vector<BaseRule*>& rules = perMethod.rules;
 
-        const std::pair<unsigned, RoutingParams>& found = trie.find(req.url);
+        const std::pair<unsigned, RoutingParams>& found =
+            trie.find(req.url().encoded_path());
         unsigned ruleIndex = found.first;
         if (ruleIndex == 0U)
         {
-            BMCWEB_LOG_DEBUG << "Cannot match rules " << req.url;
+            BMCWEB_LOG_DEBUG << "Cannot match rules "
+                             << req.url().encoded_path();
             res.result(boost::beast::http::status::not_found);
             res.end();
             return;
@@ -1269,8 +1272,9 @@
         if ((rules[ruleIndex]->getMethods() &
              (1U << static_cast<size_t>(*verb))) == 0)
         {
-            BMCWEB_LOG_DEBUG << "Rule found but method mismatch: " << req.url
-                             << " with " << req.methodString() << "("
+            BMCWEB_LOG_DEBUG << "Rule found but method mismatch: "
+                             << req.url().encoded_path() << " with "
+                             << req.methodString() << "("
                              << static_cast<uint32_t>(*verb) << ") / "
                              << rules[ruleIndex]->getMethods();
             res.result(boost::beast::http::status::not_found);
@@ -1324,13 +1328,14 @@
             // route
             if (foundRoute.allowHeader.empty())
             {
-                foundRoute.route = findRouteByIndex(req.url, notFoundIndex);
+                foundRoute.route =
+                    findRouteByIndex(req.url().encoded_path(), notFoundIndex);
             }
             else
             {
                 // See if we have a method not allowed (405) handler
-                foundRoute.route =
-                    findRouteByIndex(req.url, methodNotAllowedIndex);
+                foundRoute.route = findRouteByIndex(req.url().encoded_path(),
+                                                    methodNotAllowedIndex);
             }
         }
 
diff --git a/http/utility.hpp b/http/utility.hpp
index 71f39c8..4e6ed71 100644
--- a/http/utility.hpp
+++ b/http/utility.hpp
@@ -643,10 +643,10 @@
     std::string_view segment;
 };
 
-inline bool readUrlSegments(const boost::urls::url_view& urlView,
+inline bool readUrlSegments(const boost::urls::url_view& url,
                             std::initializer_list<UrlSegment>&& segments)
 {
-    const boost::urls::segments_view& urlSegments = urlView.segments();
+    const boost::urls::segments_view& urlSegments = url.segments();
 
     if (!urlSegments.is_absolute())
     {
@@ -687,10 +687,9 @@
 } // namespace details
 
 template <typename... Args>
-inline bool readUrlSegments(const boost::urls::url_view& urlView,
-                            Args&&... args)
+inline bool readUrlSegments(const boost::urls::url_view& url, Args&&... args)
 {
-    return details::readUrlSegments(urlView, {std::forward<Args>(args)...});
+    return details::readUrlSegments(url, {std::forward<Args>(args)...});
 }
 
 inline boost::urls::url replaceUrlSegment(const boost::urls::url_view& urlView,
@@ -723,13 +722,13 @@
     return url;
 }
 
-inline std::string setProtocolDefaults(const boost::urls::url_view& url)
+inline std::string setProtocolDefaults(const boost::urls::url_view& urlView)
 {
-    if (url.scheme() == "https")
+    if (urlView.scheme() == "https")
     {
         return "https";
     }
-    if (url.scheme() == "http")
+    if (urlView.scheme() == "http")
     {
         if (bmcwebInsecureEnableHttpPushStyleEventing)
         {
