Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.htaccess中PDF和图像文件的规范头链接_.htaccess_Http Headers_Apache2_Ubuntu 12.04_Canonical Link - Fatal编程技术网

.htaccess中PDF和图像文件的规范头链接

.htaccess中PDF和图像文件的规范头链接,.htaccess,http-headers,apache2,ubuntu-12.04,canonical-link,.htaccess,Http Headers,Apache2,Ubuntu 12.04,Canonical Link,我正在尝试在我的网站上为一些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://

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

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

我知道
不理解路径,
在.htaccess文件中不起作用


有没有一个相当简单的方法来实现这一点?

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

这是解决方案

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

你能做什么?

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


标题添加链接';rel=“规范的”


一旦将其添加到.htaccess文件中,就需要测试头文件,以确保它能够准确地工作。对于IIS解决方案,请尝试以下操作

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

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

我在所有子目录中设置了单独的.htaccess文件,并使用了
标题集链接';rel=“canonical”
将规范添加到该目录中的每个文件。然后我决定将它们全部移动到
httpd.conf
文件中(这样我就可以使用
)。我没有在生产服务器上测试它,因为我在开发端遇到了一些重定向问题。在将规则添加到
httpd.conf
时,是否有理由使用这种方法?我采用这种方法是为了满足尽可能少的重写规则以及规范标记包含文件所在目录的要求。它还可以处理站点上任何位置的任何pdf/图像文件。要满足这两个要求,只使用apache指令,您需要为每个文件夹使用一个新指令。因此,如果您添加了一个包含PDF/图像的新文件夹,则需要一个新规则。如果您改为对每个pdf/图像的规范URL使用相同的URL,那么您可以在单个FILEMATCH指令中完成这一点。谢谢:-)这将比在httpd.conf中让所有内容都正常工作容易得多。我只想再次感谢您。我拿了你的剧本,为“特殊”的情况做了一系列的调整。它比我以前使用的.htaccess方法工作得更好!你是一位绅士和学者。