There is an infinite-redirect loop in the request processor that occurs when the user accesses a subsite which has a host_node_map and the URL contains the path to the subsite as its prefix. For example, if there was a subsite named mysubsite on OpenACS.org with a host_node_map entry associating it with mysubsite.openacs.org, then accessing the (hypothetical) image at the URL http://mysubsite.openacs.org/mysubsite/images/logo.png would lead to an infinite-redirect loop (client is immediately redirected back to http://mysubsite.openacs.org/mysubsite/images/logo.png).
The problem occurs because the URL that is modified is not being sent back to the user. The user gets the original URL. The fix is to use the modified $url variable instead of the un-modified $ad_conn_url.
Here is a patch:
--- request-processor-procs.tcl
+++ request-processor-procs.tcl
@@ -550,25 +550,25 @@
# remove this prefix from the URL, and redirect.
if { $root ne "" } {
if { [regexp "^${root}(.*)$" $ad_conn_url match url] } {
if { [regexp {^GET [^\?]*\?(.*) HTTP} [ns_conn request] match vars] } {
append url ?$vars
}
if { [security::secure_conn_p] } {
# it's a secure connection.
ad_returnredirect \
- -allow_complete_url https://[ad_host][ad_port]$ad_conn_url
+ -allow_complete_url https://[ad_host][ad_port]$url
return "filter_return"
} else {
ad_returnredirect \
- -allow_complete_url http://[ad_host][ad_port]$ad_conn_url
+ -allow_complete_url http://[ad_host][ad_port]$url
return "filter_return"
}
}
# Normal case: Prepend the root to the URL.
# 3. set the intended URL
ad_conn -set url ${root}${ad_conn_url}
set ad_conn_url [ad_conn url]