Let's say we have a template:
<html>
<head>
<meta charset="UTF-8">
<title>my title</title>
</head>
<body>
<div class="photo"
style="background-image: url('@routes.ImageController.myPicture("funnyCat")')"></div>
</body>
</html>
and we use it like this:
public Result preparePdf() {
final String host = routes.HomeController.index().absoluteURL(request());
return ok(pdfGenerator.toBytes(views.html.myPdf.render(), host))
.withHeader("Content-Disposition", "attachment; filename*=UTF-8''My.pdf")
.as("application/pdf");
}
and - what is important - our application.conf looks like this:
play {
http {
secret.key="secret_here"
hostname = "myhost.io"
}
filters {
enabled=[play.filters.hosts.AllowedHostsFilter]
hosts.allowed=["myhost.io"]
}
}
If you run stage locally - everything works fine and photos are displayed in PDF.
BUT if you are running your server with Apache mod_proxy:
ProxyRequests Off
ProxyPreserveHost On
AllowEncodedSlashes NoDecode
ProxyPass / http://localhost:9009/ nocanon
ProxyPassReverse / http://localhost:9009/
then even if: final String host = routes.HomeController.index().absoluteURL(request()); points correctly to https://myhost.io, PDF is generated but no photos are displayed, nor exception is thrown.
It just fails silently!
Workaround that I found after hours of investigation is that you must use http://localhost:9009 for both:
// final String host = routes.HomeController.index().absoluteURL(request());
final String host = "http://localhost:9009";
and
filters {
enabled=[play.filters.hosts.AllowedHostsFilter]
hosts.allowed=["myhost.io", "localhost:9009"]
}
Why play2-pdf reads photos from localhost:9009 even though I'm pointing it specifically to myhost.io?
Let's say we have a template:
and we use it like this:
and - what is important - our
application.conflooks like this:If you run
stagelocally - everything works fine and photos are displayed in PDF.BUT if you are running your server with Apache mod_proxy:
then even if:
final String host = routes.HomeController.index().absoluteURL(request());points correctly tohttps://myhost.io, PDF is generated but no photos are displayed, nor exception is thrown.It just fails silently!
Workaround that I found after hours of investigation is that you must use
http://localhost:9009for both:and
Why
play2-pdfreads photos fromlocalhost:9009even though I'm pointing it specifically tomyhost.io?