diff --git a/lib/src/StaticFileRouter.cc b/lib/src/StaticFileRouter.cc index 4d89793633..7210b115d2 100644 --- a/lib/src/StaticFileRouter.cc +++ b/lib/src/StaticFileRouter.cc @@ -169,7 +169,18 @@ void StaticFileRouter::route( if (std::filesystem::is_directory(fsFilePath, err)) { // Check if path is eligible for an implicit index.html - if (implicitPageEnable_) + if (implicitPageEnable_ && req->path().back() != '/') + { + std::string newLocation = req->path() + "/"; + if (!req->query().empty()) + { + newLocation += "?" + req->query(); + } + callback(HttpResponse::newRedirectionResponse( + newLocation, k301MovedPermanently)); + return; + } + else if (implicitPageEnable_) { filePath = filePath + "/" + implicitPage_; } @@ -244,7 +255,19 @@ void StaticFileRouter::route( if (std::filesystem::is_directory(fsDirectoryPath, err)) { // Check if path is eligible for an implicit index.html - if (implicitPageEnable_) + if (implicitPageEnable_ && req->path().back() != '/') + { + std::string newLocation = req->path() + "/"; + if (!req->query().empty()) + { + newLocation += "?" + req->query(); + } + callback( + HttpResponse::newRedirectionResponse(newLocation, + k301MovedPermanently)); + return; + } + else if (implicitPageEnable_) { std::string filePath = directoryPath + "/" + implicitPage_; sendStaticFileResponse(filePath, req, std::move(callback), ""); diff --git a/lib/tests/integration_test/client/main.cc b/lib/tests/integration_test/client/main.cc index f07d2ea6f1..e7d6e05ee6 100644 --- a/lib/tests/integration_test/client/main.cc +++ b/lib/tests/integration_test/client/main.cc @@ -673,6 +673,15 @@ void doTest(const HttpClientPtr &client, std::shared_ptr TEST_CTX) req = HttpRequest::newHttpRequest(); req->setMethod(drogon::Get); req->setPath("/a-directory"); + client->sendRequest( + req, [req, TEST_CTX](ReqResult result, const HttpResponsePtr &resp) { + REQUIRE(result == ReqResult::Ok); + CHECK(resp->getStatusCode() == k301MovedPermanently); + CHECK(resp->getHeader("Location") == "/a-directory/"); + }); + req = HttpRequest::newHttpRequest(); + req->setMethod(drogon::Get); + req->setPath("/a-directory/"); client->sendRequest(req, [req, TEST_CTX, body](ReqResult result, const HttpResponsePtr &resp) {