Я хочу перенаправить с этого URL:
localhost: 80 / files / 1.pdf
на этот URL:
localhost: 80 / viewer.html? pdf = / files / 1.pdf
Я использую nginx return для этого:
location ~* /files/(.+\.pdf)$ {
return $scheme://$host:$server_port/viewer.html?pdf=/files/$1;
}
viewer.html использует PDF.js и пытается открыть PDF-файл, указанный в параметрах URL-адресов, и записать номера его страниц:
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="https://cdn.jsdelivr.net/npm/pdfjs-dist@2.3.200/build/pdf.min.js">
</script>
</head>
<body>
<script>
const queryString = window.location.search; // has the params of the url
const urlParams = new URLSearchParams(queryString); //parses the params
const filePath = urlParams.get('pdf');
var loadpdf = pdfjsLib.getDocument(filePath);
loadpdf.promise.then(function(document) {
console.log(document._pdfInfo.numPages);
}, function (reason) { // PDF loading error
console.error(reason);
});
</script>
</body>
</html>
Когда перенаправление случается, что заголовок ответа HTTP GET PDF-файла имеет тип содержимого: text / html вместо application / pdf, и PDF-файл больше не может быть прочитан.
Что-то не так с возвратом nginx, может ли кто-нибудь указать, что это такое?
Вам не хватает важных частей средства просмотра. html, а конфигурация nginx должна предотвращать перенаправление, если запрос исходит от средства просмотра. Попробуйте следующее:
nginx config:
location ~* ^/.*\.pdf$ {
if ( $query_string !~ "noredir" ) {
rewrite /(.*\.pdf)$ viewer.html?pdf=$1 redirect;
}
try_files $uri =404;
}
viewer.html (добавляет? Noredir к пути к файлу):
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="https://cdn.jsdelivr.net/npm/pdfjs-dist@2.3.200/build/pdf.min.js">
</script>
</head>
<body>
<canvas id="the-canvas"></canvas>
<script>
const queryString = window.location.search; // has the params of the url
const urlParams = new URLSearchParams(queryString); //parses the params
const filePath = urlParams.get('pdf') + "?noredir";
var loadpdf = pdfjsLib.getDocument(filePath);
console.log(filePath);
loadpdf.promise.then(function(pdf) {
console.log('PDF loaded');
// Fetch the first page
var pageNumber = 1;
pdf.getPage(pageNumber).then(function(page) {
console.log('Page loaded');
var scale = 1.5;
var viewport = page.getViewport({scale: scale});
// Prepare canvas using PDF page dimensions
var canvas = document.getElementById('the-canvas');
var context = canvas.getContext('2d');
canvas.height = viewport.height;
canvas.width = viewport.width;
// Render PDF page into canvas context
var renderContext = {
canvasContext: context,
viewport: viewport
};
var renderTask = page.render(renderContext);
renderTask.promise.then(function () {
console.log('Page rendered');
});
});
}, function (reason) {
// PDF loading error
console.error(reason);
});
</script>
</body>
</html>
Это основано на pdf.js примерах на github
Проблема заключалась в том, что перенаправление также происходило, когда я пытался получить сам PDF-файл!
Поэтому я добавил параметр к URL-адресу, когда мы хотели получить pdf:
var loadpdf = pdfjsLib.getDocument(filePath+ "?getFile=true");
И изменил nginx.conf на перенаправление только тогда, когда у меня нет других параметров по URL-адресу:
location ~* /files/(.+\.pdf)$ {
if ($is_args = "") { # do the redirect only if you have no parameters in the url
return $scheme://$host:$server_port/viewer.html?pdf=/files/$1;
}
}
Спасибо @Gerard H. Pille