3

私の Web サイトにある多数の PDF ファイルと画像ファイルの Canonical リンクを設定しようとしています。

フォルダ構造の例:

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

PDF URL から Canonical URL への例: http://www.example.com/docs/folder1/file.pdf --> http://www.example.com/products/folder1/

すべての画像と PDF を含む各サブフォルダーに個別の .htaccess ファイルを配置する必要がないようにしています。現在、7 つの「メイン」フォルダーがあり、これらの各フォルダーには 2 ~ 10 個のサブフォルダーがあり、ほとんどのサブフォルダーには独自のサブフォルダーがあります。約 80 個の PDF と、さらに多くの画像があります。

特定のフォルダー内のすべてのファイルの正規リンクが単一の URL に設定される (半) 動的なソリューションを探しています。1 つの .htaccess ファイルにできるだけ多くの情報を保持したいと考えています。

私はそれを知っていますが、パスを理解していませ<Files>ん.htaccessファイルでは機能しません。<FilesMatch><Directory><DirectoryMatch>

これを達成するためのかなり簡単な方法はありますか?

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 に答える