Unfortunately, Jira generates some fully-qualified links which started with http://localhost:8080. Once this fully-qualified link gets to the user's browser it obviously won't work. To solve this problem I used a combination of different Apache directives to search through the response from Jira and replace any of the localhost URLs. Let's take a look.
# Turn compression off in order for the Substitute to work. RequestHeader unset Accept-Encoding # http://httpd.apache.org/docs/2.4/mod/mod_proxy.html#examples ProxyPass / http://localhost:8080/ ProxyPassReverse / http://localhost:8080/ Substitute "s|http://localhost:8080|https://ferris-jira.ddns.net|n" # In order for the substitute module to work we have to add it to the filter chain. FilterDeclare Substitute FilterProvider Substitute SUBSTITUTE "%{REQUEST_URI} =~ m#^/#" FilterChain +Substitute
The first thing we need to do is use RequestHeader and turn off compression (#2). If the response from Jira is zipped, we can't do any search and replace so the response needs to be plain text. Next are the typical ProxyPass (#4) and ProxyPassReverse (#5). These get the request to Jira and the response from Jira. Next we define a Subsitute (#6) for what we want to replace. You'll recognize this syntax from the sed command. Finally we have a filter chain to get the Substitute to run on the response (#8-10). The filter matches on the URI of the request made to Apache (#9), and is typically configured to the application's context. In the example above, I have Jira running as the root context / which is why ProxyPass and ProxyPassReverse have http://localhost:8080/ and the FilterProvider matches the regular expression m#^/#. If Jira was running on the "jira" context, the configuration would be ProxyPass and ProxyPassReverse with http://localhost:8080/jira and FilterProvider with the regular expression m#^/jira#.
So that's it. put this into your Apache <VirtualHost>, restart Apache and you'll be good to go.
References
ArtemGr. (Oct 15, 2013). Apache 2.4 reverse proxy with URL substitution. Retrieved April 10, 2015 from https://gist.github.com/ArtemGr/6993113
Enjoy!
Hi,
ReplyDeletethanks for sharing this... It almost does what I'm looking for, but I need a slightly different solution: My external domain is like https://external.com/jira/ and the internal instance is w/o context path like https://internal.domain/. What do I have to change in the code? TIA!
My guess would be:
ReplyDeleteProxyPass /jira/ http://internal.domain/
ProxyPassReverse /jira/ http://internal.domain/