【问题标题】:Canonical Header Links for PDF and Image files in .htaccess.htaccess 中 PDF 和图像文件的规范标题链接
【发布时间】:2013-01-16 05:32:02
【问题描述】:

我正在尝试为我网站上的许多 PDF 和图像文件设置规范链接。

示例文件夹结构:

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

PDF URL 到规范 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 文件中不起作用。

有没有相当简单的方法来完成这个?

【问题讨论】:

    标签: .htaccess http-headers apache2 ubuntu-12.04 canonical-link


    【解决方案1】:

    我不知道单独使用 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";
    }
    

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

    【讨论】:

    • 我在所有子目录中设置了单独的 .htaccess 文件,并使用 &lt;FilesMatch "\.(pdf|gif|jpg|jpeg|png|ico|swf|js|css)$"&gt; Header set Link '&lt;http://www.example.com/&gt;; rel="canonical"'&lt;/FilesMatch&gt; 将 Canonicals 添加到该目录中的每个文件。然后我决定将它们全部移动到httpd.conf 文件中(这样我就可以使用&lt;Directory ...&gt;&lt;DirectoryMatches ...&gt;)。我没有在生产服务器上测试它,因为我在开发端遇到了一些重定向问题。是否有理由使用此方法而不是将规则添加到httpd.conf
    • 我采用这种方法来满足尽可能少的重写规则和规范标签包含文件所在目录的要求。它还具有适用于任何 pdf/图像文件的好处您网站上的任何位置。
    • 要满足这两个要求,只使用 apache 指令,您需要为每个文件夹添加一个新指令。因此,如果您添加了一个带有 pdfs/images 的新文件夹,则需要一个新规则。如果您改为对每个 pdf/图像的规范 URL 使用相同的 URL,那么您可以在单个 FilesMatch 指令中完成此操作。
    • 谢谢 :-) 这比让一切都在 httpd.conf 中工作要容易得多。
    • 我只是想再次感谢您。我拿了你的脚本并针对“特殊”情况对其进行了一些调整。它比我以前使用的 .htaccess 方法效果更好!你是一位绅士和学者。
    【解决方案2】:

    这里是解决方案!!!

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

    你可以怎么做?

    举个例子,我有一个名为“testPDF.pdf”的 pdf,它位于我网站的根文件夹中。 只需将以下代码粘贴到 .htaccss 文件中即可。

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        我能够通过单个 .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>
        

        【讨论】:

          猜你喜欢
          • 2013-02-25
          • 1970-01-01
          • 2013-06-30
          • 2021-12-05
          • 1970-01-01
          • 2012-07-31
          • 2019-10-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多