diff --git a/changelog.html b/changelog.html
index cd39f04388..7b0e56bf94 100644
--- a/changelog.html
+++ b/changelog.html
@@ -64,6 +64,9 @@ Upcoming changes
Fixed "Manage" sub-contextmenu for non-standalone deployments
(pull 721)
+
+ Absolute URLs in console output
+ (issue 16368)
Revert ampersand encoding which can cause backwad incompatibility issue
(pull 683)
diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java
index 117bdae2cb..e23502e1ae 100644
--- a/core/src/main/java/hudson/Functions.java
+++ b/core/src/main/java/hudson/Functions.java
@@ -183,6 +183,8 @@ public class Functions {
the same thing as "/abc/def.ghi", but this avoids the stale cache
problem when the user upgrades to new Jenkins. Stapler also sets a long
future expiration dates for such static resources.
+
+ see https://wiki.jenkins-ci.org/display/JENKINS/Hyperlinks+in+HTML
*/
context.setVariable("resURL",rootURL+getResourcePath());
context.setVariable("imagesURL",rootURL+getResourcePath()+"/images");
diff --git a/core/src/main/java/hudson/console/HyperlinkNote.java b/core/src/main/java/hudson/console/HyperlinkNote.java
index 03883cb45e..7e32acddc0 100644
--- a/core/src/main/java/hudson/console/HyperlinkNote.java
+++ b/core/src/main/java/hudson/console/HyperlinkNote.java
@@ -26,6 +26,8 @@ package hudson.console;
import hudson.Extension;
import hudson.MarkupText;
import jenkins.model.Jenkins;
+import org.kohsuke.stapler.Stapler;
+import org.kohsuke.stapler.StaplerRequest;
import java.io.IOException;
import java.util.logging.Level;
@@ -53,8 +55,16 @@ public class HyperlinkNote extends ConsoleNote {
@Override
public ConsoleAnnotator annotate(Object context, MarkupText text, int charPos) {
String url = this.url;
- if (url.startsWith("/"))
- url = Jenkins.getInstance().getRootUrl()+url.substring(1);
+ if (url.startsWith("/")) {
+ StaplerRequest req = Stapler.getCurrentRequest();
+ if (req!=null) {
+ // if we are serving HTTP request, we want to use app relative URL
+ url = req.getContextPath()+url;
+ } else {
+ // otherwise presumably this is rendered for e-mails and other non-HTTP stuff
+ url = Jenkins.getInstance().getRootUrl()+url.substring(1);
+ }
+ }
text.addMarkup(charPos, charPos + length, "", "");
return null;
}
diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java
index 94fa474099..a11dd34845 100755
--- a/core/src/main/java/jenkins/model/Jenkins.java
+++ b/core/src/main/java/jenkins/model/Jenkins.java
@@ -1864,6 +1864,7 @@ public class Jenkins extends AbstractCIBase implements ModifiableTopLevelItemGro
* @since 1.66
* @see Descriptor#getCheckUrl(String)
* @see #getRootUrlFromRequest()
+ * @see Hyperlinks in HTML
*/
public String getRootUrl() {
String url = JenkinsLocationConfiguration.get().getUrl();