2013-01-31 56 views
1

我試圖爲我的網站上的許多PDF和圖像文件設置Canonical鏈接。Canonical標題鏈接PDF和圖像文件在.htaccess

示例文件夾結構:

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

例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設置爲單個網址。我想盡可能地保留在一個.htaccess文件中。

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

有沒有一個相當簡單的方法來實現這個目標?

回答

2

我不知道用apache規則解決這個問題的方法,因爲它需要某種正則表達式匹配,並在指令中重用匹配結果,這是不可能的。

但是,如果你介紹一個PHP腳本到混合這是很簡單的:

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

請注意,這將發送所有JPG,PNG和PDF文件的請求,該腳本不管文件夾名稱。如果你只想包含特定的文件夾,你可以添加另一個RewriteCond來完成。

現在規範-的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"; 
} 

請考慮下面的代碼未經測試,並確認其工作跨瀏覽器按預期釋放到生產前。

+0

我成立了單獨的.htaccess文件中的所有的子目錄和使用'標題集鏈接'; rel =」canonical「''添加Canonicals到那個目錄中的每個文件,然後我決定將它們全部移到'httpd.conf'文件中(這樣我就可以使用''和'')在生產服務器上測試它,因爲我遇到了在開發端的一些重定向問題。是否有理由使用這種方法來將規則添加到'httpd.conf'? – AJMaxwell

+1

我採用這種方法來滿足要求儘可能少的重寫規則,並且使用規範標籤包含文件所在的目錄。它還可以爲任何位於您網站上的任何pdf /圖像文件提供服務 – bradym

+1

僅使用apache指令即可滿足這兩個要求你需要爲每個文件夾添加一個新的指令,所以如果你添加了一個新的文件夾和pdfs/images,你需要一個新的規則。每個pdf /圖像的規範URL的相同URL,那麼您可以在單個FilesMatch指令中完成此操作。 – bradym

0

這是解決方案!

您可以使用.htacess文件來控制標題,這是更簡單的管理標題的方法。

你怎麼辦?

讓我們來看一個例子,我有一個名爲「testPDF.pdf」的PDF,它位於我的網站的根文件夾中。 您只需將下列代碼粘貼到.htaccss文件中即可。

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

一旦你還說,你的.htaccess文件,你需要測試你的頭,以確保它的工作準確