Nginx return изменяет тип содержимого заголовка HTTP-ответа с application / pdf на text / html

Я хочу перенаправить с этого 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, может ли кто-нибудь указать, что это такое?

0
задан 22 April 2020 в 19:29
2 ответа

Вам не хватает важных частей средства просмотра. 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

0
ответ дан 4 January 2021 в 09:56

Проблема заключалась в том, что перенаправление также происходило, когда я пытался получить сам 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

0
ответ дан 4 January 2021 в 09:56

Теги

Похожие вопросы