Я хочу перенаправить с этого 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 имеет content-type: text / html вместо application / pdf, и PDF-файл больше не может быть прочитан.
Что-то не так с возвратом nginx, может кто-нибудь указать, что это такое?
Проблема заключалась в том, что перенаправление также происходило, когда я пытался получить сам 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
Вам не хватает важных частей страницы viewer.html, а конфигурация nginx должна предотвращать перенаправление, если запрос исходит от средства просмотра. Попробуй это:
Конфигурация nginx:
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