diff options
-rw-r--r-- | weblog.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
@@ -192,6 +192,15 @@ namespace { return article.substr(0, pos); } + std::string get_rel_target(FCGX_Request& request) + { + std::string result{FCGX_GetParam("PATH_INFO", request.envp)}; + auto pos{result.find('?')}; + if (pos != result.npos) + result = result.substr(0, pos); + return result; + } + std::string plugin_path(FCGX_Request& request) { std::string target{FCGX_GetParam("DOCUMENT_URI", request.envp)}; @@ -199,7 +208,7 @@ namespace { target = target.substr(0, target.size() - 1); } - std::string rel_target{FCGX_GetParam("PATH_INFO", request.envp)}; + std::string rel_target{get_rel_target(request)}; while (rel_target.size() > 1 && rel_target.back() == '/') { rel_target = rel_target.substr(0, rel_target.size() - 1); } @@ -404,8 +413,8 @@ void generate_page(FCGX_Request& request, Config& config) rel_target = rel_target.substr(0, 4) + "/" + rel_target; } fs::path path {fs::path{path_translated} / rel_target}; - if (target.size() && target.back() != '/' && fs::is_directory(path)) { - std::string location{FCGX_GetParam("SCRIPT_NAME", request.envp) + "/"s}; + if (target.size() && target.back() != '/' && fs::is_directory(path) && !boost::algorithm::contains(target, "?")) { + std::string location{target + "/"s}; FCGX_FPrintF(request.out, "Location: %s\r\n", location.c_str()); return HttpStatus("301", "Correcting directory path", request); } |