Switched even more URLs to pure relative ones.

Thus a YaCy peer can run behind a reverse proxy subfolder without need
for the reverse proxy to rewrite HTML links (a CPU costly operation).

Tested on Debian Jessie with an apache2 reverse proxy.

See related mantis issues http://mantis.tokeek.de/view.php?id=106 and
http://mantis.tokeek.de/view.php?id=701
This commit is contained in:
luccioman 2016-11-09 02:40:33 +01:00
parent 042c2868df
commit 7296e3884f
10 changed files with 90 additions and 41 deletions

View File

@ -289,8 +289,8 @@ promoteSearchPageGreeting.useNetworkName = false
# the following attributes can be used to define a custom image, alternative text and home page on the search page
promoteSearchPageGreeting.homepage = http://yacy.net
promoteSearchPageGreeting.imageAlt = YaCy project web site
promoteSearchPageGreeting.largeImage = /env/grafics/YaCyLogo_120ppi.png
promoteSearchPageGreeting.smallImage = /env/grafics/YaCyLogo_60ppi.png
promoteSearchPageGreeting.largeImage = env/grafics/YaCyLogo_120ppi.png
promoteSearchPageGreeting.smallImage = env/grafics/YaCyLogo_60ppi.png
# the path to the public reverse word index for text files (web pages)
# the primary path is relative to the data root, the secondary path is an absolute path
@ -1149,7 +1149,7 @@ content.phpbb3.dumpfile =
# search engine teaser: an about box in search results
# this is only shown, if the about.body is filled
about.headline=Please support YaCy!
about.body=<iframe src="env/donate.html" width="100%" height="90" border="0" frameborder="0" scrolling="no" hspace="0" vspace="0" name="donate"></iframe><br/><div style="padding:8px;">If you run a YaCy server, feel free to replace our donation plea with your own support message, use the <a href="/ConfigPortal.html">Portal Configuration</a> servlet.</div>
about.body=<iframe src="env/donate.html" width="100%" height="90" border="0" frameborder="0" scrolling="no" hspace="0" vspace="0" name="donate"></iframe><br/><div style="padding:8px;">If you run a YaCy server, feel free to replace our donation plea with your own support message, use the <a href="ConfigPortal.html">Portal Configuration</a> servlet.</div>
donation.iframesource=http://yacy.net/include/donate.html
donation.iframetarget=env/donate.html

View File

@ -1,7 +1,7 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
#(forwardToConfigBasic)#::<meta http-equiv="REFRESH" content="0; url=/ConfigBasic.html" />#(/forwardToConfigBasic)#
#(forwardToConfigBasic)#::<meta http-equiv="REFRESH" content="0; url=ConfigBasic.html" />#(/forwardToConfigBasic)#
<title>YaCy '#[clientname]#': Console Status</title>
#%env/templates/metas.template%#
<script type="text/javascript">

View File

@ -3,7 +3,7 @@
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" id="navbar-brand" href="#[promoteSearchPageGreeting.homepage]#" style="position:absolute;top:-6px;display:inline;white-space:nowrap;">
<img id="greeting-icon" class="yacylogo" src="#[promoteSearchPageGreeting.smallImage]#" alt="#[promoteSearchPageGreeting.imageAlt]#" style="height:auto; width:auto; max-width:200px; max-height:32px;vertical-align:middle">&nbsp;<span id="greeting"></span>
<img id="greeting-icon" class="yacylogo" src="#[relativeBase]##[promoteSearchPageGreeting.smallImage]#" alt="#[promoteSearchPageGreeting.imageAlt]#" style="height:auto; width:auto; max-width:200px; max-height:32px;vertical-align:middle">&nbsp;<span id="greeting"></span>
</a>
</div>
</div>

View File

@ -8,8 +8,8 @@
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" id="navbar-brand" href="/" style="position:absolute;top:-6px;display:inline;white-space:nowrap;">
<img id="greeting-icon" class="yacylogo" src="/env/grafics/yacy.png" alt="YaCy" style="height:auto; width:auto; max-width:200px; max-height:32px;vertical-align:middle;float:left;">
<a class="navbar-brand" id="navbar-brand" href="./" style="position:absolute;top:-6px;display:inline;white-space:nowrap;">
<img id="greeting-icon" class="yacylogo" src="env/grafics/yacy.png" alt="YaCy" style="height:auto; width:auto; max-width:200px; max-height:32px;vertical-align:middle;float:left;">
<span style="position:absolute;top:50%;float:left;">&nbsp;Administration</span>
</a>
<form class="navbar-form" method="get" accept-charset="UTF-8" action="yacysearch.html" style="padding-left:200px;max-width:400px;">

View File

@ -1,5 +1,5 @@
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
<link rel="shortcut icon" type="image/x-icon" href="#[relativeBase]#favicon.ico" />
<meta name="Content-Language" content="English, Englisch" />
<meta name="keywords" content="YaCy HTTP search engine spider indexer java network open free download Mac Windows Linux Software development" />
<meta name="description" content="Software HTTP Freeware Home Page" />
@ -9,8 +9,8 @@
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap core CSS -->
<link href="/env/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<link href="/env/bootstrap/css/bootstrap-switch.min.css" rel="stylesheet">
<link href="#[relativeBase]#env/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<link href="#[relativeBase]#env/bootstrap/css/bootstrap-switch.min.css" rel="stylesheet">
<script>
/*
@ -40,29 +40,29 @@ for the JavaScript code in this page.
*/
</script>
<script src="/env/bootstrap/js/jquery.min.js"></script>
<script src="/env/bootstrap/js/bootstrap.min.js"></script>
<script src="/env/bootstrap/js/bootstrap-switch.min.js"></script>
<script src="#[relativeBase]#env/bootstrap/js/jquery.min.js"></script>
<script src="#[relativeBase]#env/bootstrap/js/bootstrap.min.js"></script>
<script src="#[relativeBase]#env/bootstrap/js/bootstrap-switch.min.js"></script>
<!-- Custom styles for this template, i.e. navigation (move this to base.css) -->
<link href="/env/bootstrap-base.css" rel="stylesheet">
<link href="#[relativeBase]#env/bootstrap-base.css" rel="stylesheet">
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="/env/bootstrap/js/html5shiv.js"></script>
<script src="/env/bootstrap/js/respond.min.js"></script>
<script src="#[relativeBase]#env/bootstrap/js/html5shiv.js"></script>
<script src="#[relativeBase]#env/bootstrap/js/respond.min.js"></script>
<![endif]-->
<!-- old css styles -->
<link rel="stylesheet" type="text/css" media="all" href="/env/base.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/env/style.css" />
<link rel="stylesheet" type="text/css" media="all" href="#[relativeBase]#env/base.css" />
<link rel="stylesheet" type="text/css" media="screen" href="#[relativeBase]#env/style.css" />
<!--[if lt IE 6]>
<link rel="stylesheet" type="text/css" media="screen" href="/env/oldie.css" />
<link rel="stylesheet" type="text/css" media="screen" href="#[relativeBase]#env/oldie.css" />
<![endif]-->
<!--[if lte IE 6.0]>
<link rel="stylesheet" type="text/css" media="screen" href="/env/ie6.css" />
<link rel="stylesheet" type="text/css" media="screen" href="#[relativeBase]#env/ie6.css" />
<![endif]-->
<!--[if lte IE 7.0]>
<link rel="stylesheet" type="text/css" media="screen" href="/env/ie7.css" />
<link rel="stylesheet" type="text/css" media="screen" href="#[relativeBase]#env/ie7.css" />
<![endif]-->
<!-- (C), Architecture: Michael Peter Christen; Contact: mc <at> yacy.net -->

View File

@ -27,11 +27,11 @@
<li>&nbsp;&nbsp;<i>Example Calls to the Search API:</i></li>
<li><a href="yacysearch.json?query=www" target="_blank"><i>API</i>&nbsp;&nbsp;&nbsp;YaCy JSON</a></li>
<li><a href="yacysearch.rss?query=www" target="_blank"><i>API</i>&nbsp;&nbsp;&nbsp;YaCy RSS/Opensearch</a></li>
<li><a href="/solr/select?hl=false&wt=opensearch&facet=true&facet.mincount=1&facet.field=url_file_ext_s&start=0&rows=10&sort=load_date_dt+desc&q=description_txt:%5B*%20TO%20*%5D" target="_blank"><i>API</i>&nbsp;&nbsp;&nbsp;Solr RSS/Opensearch</a></li>
<li><a href="/solr/select?hl=false&wt=yjson&facet=true&facet.mincount=1&facet.field=url_file_ext_s&start=0&rows=10&query=www" target="_blank"><i>API</i>&nbsp;&nbsp;&nbsp;Solr Default Core / JSON</a></li>
<li><a href="/solr/collection1/select?q=*:*&defType=edismax&start=0&rows=3" target="_blank"><i>API</i>&nbsp;&nbsp;&nbsp;Solr Default Core / XML</a></li>
<li><a href="/solr/webgraph/select?q=*:*&defType=edismax&start=0&rows=3" target="_blank"><i>API</i>&nbsp;&nbsp;&nbsp;Solr Webgraph Core / XML</a></li>
<li><a href="/gsa/search?q=www&num=3" target="_blank"><i>API</i>&nbsp;&nbsp;&nbsp;Google Appliance API / XML</a></li>
<li><a href="solr/select?hl=false&wt=opensearch&facet=true&facet.mincount=1&facet.field=url_file_ext_s&start=0&rows=10&sort=load_date_dt+desc&q=description_txt:%5B*%20TO%20*%5D" target="_blank"><i>API</i>&nbsp;&nbsp;&nbsp;Solr RSS/Opensearch</a></li>
<li><a href="solr/select?hl=false&wt=yjson&facet=true&facet.mincount=1&facet.field=url_file_ext_s&start=0&rows=10&query=www" target="_blank"><i>API</i>&nbsp;&nbsp;&nbsp;Solr Default Core / JSON</a></li>
<li><a href="solr/collection1/select?q=*:*&defType=edismax&start=0&rows=3" target="_blank"><i>API</i>&nbsp;&nbsp;&nbsp;Solr Default Core / XML</a></li>
<li><a href="solr/webgraph/select?q=*:*&defType=edismax&start=0&rows=3" target="_blank"><i>API</i>&nbsp;&nbsp;&nbsp;Solr Webgraph Core / XML</a></li>
<li><a href="gsa/search?q=www&num=3" target="_blank"><i>API</i>&nbsp;&nbsp;&nbsp;Google Appliance API / XML</a></li>
</ul>
</li>
<li id="header_help" class="dropdown">

View File

@ -121,35 +121,35 @@ public class HTMLResponseWriter implements QueryResponseWriter {
//writer.write("<link rel=\"transformation\" href=\"http://www-sop.inria.fr/acacia/soft/RDFa2RDFXML.xsl\"/>\n");
writer.write("<!-- Bootstrap core CSS -->\n");
writer.write("<link href=\"/env/bootstrap/css/bootstrap.min.css\" rel=\"stylesheet\">\n");
writer.write("<link href=\"/env/bootstrap/css/bootstrap-switch.min.css\" rel=\"stylesheet\">\n");
//writer.write("<script src=\"/env/bootstrap/js/jquery.min.js\"></script>\n");
//writer.write("<script src=\"/env/bootstrap/js/bootstrap.min.js\"></script>\n");
//writer.write("<script src=\"/env/bootstrap/js/bootstrap-switch.min.js\"></script>\n");
writer.write("<link href=\"../env/bootstrap/css/bootstrap.min.css\" rel=\"stylesheet\">\n");
writer.write("<link href=\"../env/bootstrap/css/bootstrap-switch.min.css\" rel=\"stylesheet\">\n");
//writer.write("<script src=\"../env/bootstrap/js/jquery.min.js\"></script>\n");
//writer.write("<script src=\"../env/bootstrap/js/bootstrap.min.js\"></script>\n");
//writer.write("<script src=\"../env/bootstrap/js/bootstrap-switch.min.js\"></script>\n");
writer.write("<!-- Custom styles for this template, i.e. navigation (move this to base.css) -->\n");
writer.write("<link href=\"/env/bootstrap-base.css\" rel=\"stylesheet\">\n");
writer.write("<link href=\"../env/bootstrap-base.css\" rel=\"stylesheet\">\n");
//writer.write("<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n");
//writer.write("<!--[if lt IE 9]>\n");
//writer.write(" <script src=\"/env/bootstrap/js/html5shiv.js\"></script>\n");
//writer.write(" <script src=\"/env/bootstrap/js/respond.min.js\"></script>\n");
//writer.write(" <script src=\"../env/bootstrap/js/html5shiv.js\"></script>\n");
//writer.write(" <script src=\"../env/bootstrap/js/respond.min.js\"></script>\n");
//writer.write("<![endif]-->\n");
writer.write("<!-- old css styles -->\n");
writer.write("<link rel=\"stylesheet\" type=\"text/css\" media=\"all\" href=\"/env/base.css\" />\n");
writer.write("<link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"/env/style.css\" />\n");
writer.write("<link rel=\"stylesheet\" type=\"text/css\" media=\"all\" href=\"../env/base.css\" />\n");
writer.write("<link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"../env/style.css\" />\n");
writer.write("<!--[if lt IE 6]>\n");
writer.write(" <link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"/env/oldie.css\" />\n");
writer.write(" <link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"../env/oldie.css\" />\n");
writer.write("<![endif]-->\n");
writer.write("<!--[if lte IE 6.0]>\n");
writer.write(" <link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"/env/ie6.css\" />\n");
writer.write(" <link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"../env/ie6.css\" />\n");
writer.write("<![endif]-->\n");
writer.write("<!--[if lte IE 7.0]>\n");
writer.write(" <link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"/env/ie7.css\" />\n");
writer.write(" <link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"../env/ie7.css\" />\n");
writer.write("<![endif]-->\n");
writer.write("<!-- (C), Architecture: Michael Peter Christen; Contact: mc <at> yacy.net -->\n");
NamedList<Object> paramsList = request.getOriginalParams().toNamedList();
paramsList.remove("wt");
String xmlquery = dqp.matcher("/solr/select?" + SolrParams.toSolrParams(paramsList).toString()).replaceAll("%22");
String xmlquery = dqp.matcher("../solr/select?" + SolrParams.toSolrParams(paramsList).toString()).replaceAll("%22");
DocList response = ((ResultContext) values.get("response")).docs;
final int sz = response.size();
@ -194,7 +194,7 @@ public class HTMLResponseWriter implements QueryResponseWriter {
// add a link to re-crawl this url (in case it is a remote metadata only entry)
String sku = tdoc.get(CollectionSchema.sku.getSolrFieldName());
final String jsc= "javascript:w = window.open('/QuickCrawlLink_p.html?indexText=on&indexMedia=on&crawlingQ=on&followFrames=on&obeyHtmlRobotsNoindex=on&obeyHtmlRobotsNofollow=off&xdstopw=on&title='+escape('"+title+"')+'&url='+escape('"+sku+"'),'_blank','height=250,width=600,resizable=yes,scrollbar=no,directory=no,menubar=no,location=no');w.focus();";
final String jsc= "javascript:w = window.open('../QuickCrawlLink_p.html?indexText=on&indexMedia=on&crawlingQ=on&followFrames=on&obeyHtmlRobotsNoindex=on&obeyHtmlRobotsNofollow=off&xdstopw=on&title='+escape('"+title+"')+'&url='+escape('"+sku+"'),'_blank','height=250,width=600,resizable=yes,scrollbar=no,directory=no,menubar=no,location=no');w.focus();";
writer.write("<div class='btn btn-default btn-sm' style='float:right' onclick=\""+jsc+"\">re-crawl url</div>\n");
writer.write("<h1 property=\"dc:Title\">" + title + "</h1>\n");

View File

@ -1064,6 +1064,7 @@ public class YaCyDefaultServlet extends HttpServlet {
templatePatterns.putHTML(servletProperties.PEER_STAT_CLIENTNAME, sb.peers.mySeed().getName());
templatePatterns.putHTML(servletProperties.PEER_STAT_CLIENTID, sb.peers.myID());
templatePatterns.put(servletProperties.PEER_STAT_MYTIME, GenericFormatter.SHORT_SECOND_FORMATTER.format());
templatePatterns.put(servletProperties.RELATIVE_BASE, YaCyDefaultServlet.getRelativeBase(target));
Seed myPeer = sb.peers.mySeed();
templatePatterns.put("newpeer", myPeer.getAge() >= 1 ? 0 : 1);
templatePatterns.putHTML("newpeer_peerhash", myPeer.hash);
@ -1117,6 +1118,30 @@ public class YaCyDefaultServlet extends HttpServlet {
}
}
}
/**
* Returns the relative path prefix necessary to reach htroot from the deepest level of targetPath.<br>
* Example : targetPath="api/citation.html" returns "../"
* targetPath is supposed to have been cleaned earlier from special chars such as "?", spaces, "//".
* @param targetPath target path relative to htroot
* @return the relative path prefix, eventually empty
*/
protected static String getRelativeBase(String targetPath) {
StringBuilder relativeBase = new StringBuilder();
if(targetPath != null) {
/* Normalize target path : it is relative to htroot, starting with a slash or not */
if(targetPath.startsWith("/")) {
targetPath = targetPath.substring(1, targetPath.length());
}
int slashIndex = targetPath.indexOf('/', 0);
while(slashIndex >= 0) {
relativeBase.append("../");
slashIndex = targetPath.indexOf('/', slashIndex + 1);
}
}
return relativeBase.toString();
}
/**
* Eventually update response headers for image resources

View File

@ -32,6 +32,9 @@ public class servletProperties extends serverObjects {
public static final String PEER_STAT_MYTIME = "mytime";
public static final String PEER_STAT_CLIENTNAME = "clientname";
public static final String PEER_STAT_CLIENTID = "clientid";
/** Key of the relative path part from requested file to reach htroot, to be used in templates such as metas.template.
* Example : target="api/citation.html" -> relativeBase="../" */
public static final String RELATIVE_BASE = "relativeBase";
private String prefix="";

View File

@ -116,5 +116,26 @@ public class YaCyDefaultServletTest {
assertEquals("http://myhost.com:8090", YaCyDefaultServlet.getContext(header, null));
}
/**
* Tests on getRelativeBase()
*/
@Test
public void testGetRelativeBase() {
assertEquals("", YaCyDefaultServlet.getRelativeBase(null));
assertEquals("", YaCyDefaultServlet.getRelativeBase(""));
assertEquals("", YaCyDefaultServlet.getRelativeBase("/"));
assertEquals("", YaCyDefaultServlet.getRelativeBase("/file.html"));
assertEquals("", YaCyDefaultServlet.getRelativeBase("file.html"));
assertEquals("", YaCyDefaultServlet.getRelativeBase("resource"));
assertEquals("../", YaCyDefaultServlet.getRelativeBase("folder/file.html"));
assertEquals("../", YaCyDefaultServlet.getRelativeBase("folder/resource"));
assertEquals("../", YaCyDefaultServlet.getRelativeBase("/folder/resource"));
assertEquals("../", YaCyDefaultServlet.getRelativeBase("a/b"));
assertEquals("../../", YaCyDefaultServlet.getRelativeBase("folder/subfolder/resource"));
assertEquals("../../", YaCyDefaultServlet.getRelativeBase("/folder/subfolder/resource"));
assertEquals("../", YaCyDefaultServlet.getRelativeBase("folder/"));
assertEquals("../../", YaCyDefaultServlet.getRelativeBase("folder/subfolder/"));
}
}