diff --git a/src/yaws_server.erl b/src/yaws_server.erl index 4fac9681..a6d976a9 100644 --- a/src/yaws_server.erl +++ b/src/yaws_server.erl @@ -2704,14 +2704,17 @@ deliver_redirect_map(CliSock, Req, Arg, %% Here Code is 1xx, 2xx, 4xx or 5xx ?Debug("in redir ~p", [Code]), deliver_xxx(CliSock, Req, Arg, Code); -deliver_redirect_map(_CliSock, _Req, Arg, - {_Prefix, Code, Path, Mode}, N) when is_list(Path) -> +deliver_redirect_map(_CliSock, _Req, #arg{server_path = ServerPath} = Arg, + {_Prefix, Code, Path, Mode}, N) + when is_list(Path) andalso + %% Stop redirect loops + ServerPath /= Path -> %% Here Code is 1xx, 2xx, 4xx or 5xx ?Debug("in redir ~p", [Code]), Path1 = if Mode == append -> - filename:join([Path ++ Arg#arg.server_path]) ++ - preserve_trailing_slash(Arg#arg.server_path); + filename:join([Path ++ ServerPath]) ++ + preserve_trailing_slash(ServerPath); true -> %% noappend Path end, @@ -2725,8 +2728,10 @@ deliver_redirect_map(_CliSock, _Req, Arg, put(yaws_arg, Arg), put(client_data_pos, N), {page, {[{status, Code}], Page}}; -deliver_redirect_map(CliSock, Req, Arg, - {_Prefix, Code, URL, Mode}, N) when is_record(URL, url) -> +deliver_redirect_map(CliSock, Req, #arg{server_path = ServerPath} = Arg, + {_Prefix, Code, #url{path = Path} = URL, Mode}, N) + when %% Stop redirect loops + ServerPath /= Path -> %% Here Code is 3xx ?Debug("in redir ~p", [Code]), H = get(outh), @@ -2736,8 +2741,8 @@ deliver_redirect_map(CliSock, Req, Arg, end, LocPath = if Mode == append -> - Path1 = filename:join([URL#url.path ++ Arg#arg.server_path]) ++ - preserve_trailing_slash(Arg#arg.server_path), + Path1 = filename:join([Path ++ ServerPath]) ++ + preserve_trailing_slash(ServerPath), yaws_api:format_partial_url( URL#url{path=Path1,querypart=QueryData}, get(sc) );