Ссылки на канонические заголовки для файлов PDF и изображений в .htaccess

Я пытаюсь настроить ссылки Canonical для ряда файлов PDF и изображений на своем веб-сайте.

Пример структуры папок:

/index.php
/docs/
    file.pdf
    /folder1/
        file.pdf
    /folder2/
        file1.pdf
        file2.pdf
/img/
    sprite.png
    /slideshow/
        slide1.jpg
        slide2.jpg

Пример URL-адреса PDF для канонического URL-адреса: http://www.example.com/docs/folder1/file.pdf --> http://www.example.com/products/folder1/

Я стараюсь не помещать отдельные файлы .htaccess в каждую из подпапок, содержащих все мои изображения и PDF-файлы. В настоящее время у меня есть 7 «основных» папок, и в каждой из этих папок есть от 2 до 10 подпапок, и у большинства подпапок есть свои собственные подпапки. У меня около 80 PDF-файлов и даже больше изображений.

Я ищу (полу)динамическое решение, в котором все файлы в определенной папке будут иметь каноническую ссылку, установленную на один URL-адрес. Я хочу сохранить как можно больше в одном файле .htaccess.

Я знаю, что <Files> и <FilesMatch> не понимают путей, а <Directory> и <DirectoryMatch> не работают в файлах .htaccess.

Есть ли довольно простой способ сделать это?


person AJMaxwell    schedule 31.01.2013    source источник


Ответы (3)


Я не знаю, как решить эту проблему только с помощью правил apache, поскольку для этого потребуется какое-то сопоставление регулярных выражений и повторное использование результата совпадения в директиве, что невозможно.

Однако это довольно просто, если вы добавите в смесь php-скрипт:

RewriteEngine On
RewriteCond %{REQUEST_URI} \.(jpg|png|pdf)$
RewriteRule (.*) /canonical-header.php?path=$1

Обратите внимание, что это приведет к отправке запросов для всех файлов jpg, png и pdf в сценарий независимо от имени папки. Если вы хотите включить только определенные папки, вы можете добавить еще один RewriteCond для этого.

Теперь скрипт canonical-header.php:

<?php

// Checking for the presence of the path variable in the query string allows us to easily 404 any requests that
// come directly to this script, just to be safe.
if (!empty($_GET['path'])) {
    // Be sure to add any new file types you want to handle here so the correct content-type header will be sent.
    $mimeTypes = array(
        'pdf' => 'application/pdf',
        'jpg' => 'image/jpeg',
        'png' => 'image/png',
    );

    $path         = filter_input(INPUT_GET, 'path', FILTER_SANITIZE_URL);
    $file         = realpath($path);
    $extension    = pathinfo($path, PATHINFO_EXTENSION);
    $canonicalUrl = 'http://' . $_SERVER['HTTP_HOST'] . '/' . dirname($path);
    $type         = $mimeTypes[$extension];

    // Verify that the file exists and is readable, or send 404
    if (is_readable($file)) {
        header('Content-Type: ' . $type);
        header('Link <' . $canonicalUrl . '>; rel="canonical"');
        readfile(realpath($path));
    } else {
        header('HTTP/1.0 404 Not Found');
        echo "File not found";
    }
} else {
    header('HTTP/1.0 404 Not Found');
    echo "File not found";
}

Считайте этот код непроверенным и убедитесь, что он работает должным образом в разных браузерах, прежде чем запускать его в производство.

person bradym    schedule 07.02.2013
comment
Я создал отдельные файлы .htaccess во всех подкаталогах и использовал <FilesMatch "\.(pdf|gif|jpg|jpeg|png|ico|swf|js|css)$"> Header set Link '<http://www.example.com/>; rel="canonical"'</FilesMatch> для добавления Canonicals к каждому файлу в этом каталоге. Затем я решил переместить их все в файл httpd.conf (чтобы я мог использовать <Directory ...> и <DirectoryMatches ...>). Я не тестировал его на рабочем сервере, потому что у меня возникают проблемы с некоторыми перенаправлениями на стороне разработчика. Есть ли причина использовать этот метод вместо добавления правил в httpd.conf? - person AJMaxwell; 07.02.2013
comment
Я применил этот подход, чтобы удовлетворить требования иметь как можно меньше правил перезаписи и чтобы канонический тег включал каталог, в котором находится файл. Он также имеет преимущество работы с любым файлом pdf/image в любом месте на вашем сайте. - person bradym; 08.02.2013
comment
Чтобы выполнить оба этих требования, используя только директивы apache, вам потребуется новая директива для каждой папки. Поэтому, если вы добавили новую папку с pdf/изображениями, вам понадобится новое правило. Если вместо этого вы используете один и тот же URL-адрес для канонического URL-адреса каждого файла PDF/изображения, вы можете сделать это в одной директиве FilesMatch. - person bradym; 08.02.2013
comment
Спасибо :-) Это будет гораздо проще реализовать, чем заставить все работать в httpd.conf. - person AJMaxwell; 08.02.2013
comment
Я просто хотел поблагодарить вас еще раз. Я взял ваш скрипт и немного подправил его для особых случаев. Он работает лучше, чем метод .htaccess, который я использовал раньше! Вы джентльмен и ученый. - person AJMaxwell; 08.02.2013

Вот решение!!!

вы можете использовать файл .htacess для управления заголовком, что является более простым способом управления заголовками.

Как вы можете это сделать?

Возьмем пример: у меня есть pdf-файл с именем «testPDF.pdf», который находится в корневой папке моего сайта. Все, что вам нужно сделать, это вставить следующий код в файл .htaccss.

<Files testPDF.pdf > Header add Link '<http://<your_site_name>.com/ >; rel="canonical"' </Files>

После того, как вы добавите это в свой файл .htaccess, вам нужно будет проверить свой заголовок, чтобы убедиться, что он работает правильно.

person Community    schedule 19.01.2016

Для решения IIS попробуйте что-то вроде этого.

Response.AppendHeader("Link", "<" + "https://" + Request.Url.Host + "/" + product.GetSeName() + ">; rel=\"canonical\"");

это было добавлено в функцию, которая генерировала PDF-версию веб-страницы :)

person Web Devvy    schedule 12.02.2019