3

我正在尝试为我网站上的许多 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,甚至更多的图像。

我正在寻找一种(半)动态解决方案,其中某个文件夹中的所有文件都将 Canonical Link 设置为单个 url。我想尽可能多地保存在一个 .htaccess 文件中。

我知道<Files>并且<FilesMatch>不理解路径,并且<Directory><DirectoryMatch>.htaccess 文件中不起作用。

有没有一种相当简单的方法可以做到这一点?

4

4 回答 4

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";
}

请考虑此代码未经测试,并在将其发布到生产环境之前检查它是否在浏览器中按预期工作。

于 2013-02-07T17:06:23.420 回答
1

这是解决方案!

您可以使用.htacess文件来控制标头,这是管理标头的更简单方法。

你能怎么办?

举个例子,我有一个名为“testPDF.pdf”的 pdf,它位于我网站的根文件夹中。您所要做的就是将以下代码粘贴到 .htaccss 文件中。

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

将其添加到 .htaccess 文件后,您需要测试标头以确保其正常工作

于 2016-01-19T10:04:15.130 回答
1

对于 IIS 解决方案,请尝试类似的方法。

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

这已添加到生成网页 PDF 版本的功能中:)

于 2019-02-12T05:28:40.470 回答
1

我能够通过单个 .htacess 文件为不同目录中的文件添加规范链接。

以下代码为指向同一目录的每个文件添加了一个规范链接:

<FilesMatch "\.(jpg|png|pdf)$">
    RewriteRule ([^/]+)\.(jpg|png|pdf)$ - [E=FILENAME:%{HTTP_HOST}/<your-desired-location>/$1.$2]
    Header add Link '<https://%{FILENAME}e>; rel="canonical"'
</FilesMatch>

下面的代码添加了一个指向文件请求 URL 的规范链接,在许多情况下,这将是它在服务器上的实际位置:

<FilesMatch "\.(jpg|png|pdf)$">
    RewriteRule ([^/]+)\.(jpg|png|pdf)$ - [E=FILENAME:%{HTTP_HOST}%{REQUEST_URI}]
    Header set Link '<https://%{FILENAME}e>; rel="canonical"'
</FilesMatch>
于 2021-12-22T21:12:10.357 回答