Last-Modified、Symfony、およびSearch Index Accelerationヘッダー

Webサイトを作成するとき、多くの開発者は非常に便利なLast-Modifiedヘッダーを忘れています。これにより、Webページの読み込みを最適化し、検索ロボットの作業を容易にすることができます。 次に、この迷惑なギャップを埋めようとします。





Last-Modifiedヘッダーの目的は何ですか?



名前から推測できるように、ヘッダーの機能は、Webドキュメントの最終変更の日付をクライアントに通知することです。 rfc 2616仕様に基づいて、クライアントは「If-Modified-Since」ヘッダーをサーバーに送信することにより、特定の日付からページが変更された場合にWebサーバーに「問い合わせ」ます。 ページが変更されていない場合、サーバーは「304 Not Modified」ヘッダーのみを返します。それ以外の場合、サーバーは「200 OK」ヘッダーとページの本文を返します。 ご覧のとおり、利点はサーバーとクライアントの両方にあります。ブラウザーはページを何度もロードせず、Webサーバーはより少ないデータを提供します。







どのサイトがより良いインデックスに登録されていますか? 動的か静的か?



数年前、SEOの間でどのサイトがより良いインデックスに登録されているかについて議論がありましたか? 動的、たとえばphpで記述されているか、またはプログラミング言語を使用しない静的です。 Last-Modifiedヘッダーを知っていれば、この質問に答えることができます。 問題は、ファイルが静的な場合、Webサーバー自体が「If-Modified-Since」ヘッダーを処理することです。 動的なページ生成の場合、答えに対する責任はすべてプログラミング言語と開発者にあります。 また、開発者はこの問題に関心がないことが多いため、ヘッダーはまったく提供されません。



Last-Modifiedヘッダーは検索インデックス作成をどのように高速化しますか?



Yandexのヘルプに記載れているように、すべては単純です。「ロボットは、最後のインデックス作成以降、サイトのページが更新されたかどうかに関する情報を取得できません。 また、ロボットがサイトから一度に受信するページの数は限られているため、変更されたページのインデックスの再作成頻度は低くなります。



想像してみて。 1万ページのサイトがあります。 このサイトはphpで書かれています。 Last-Modifiedヘッダーが正しく指定されていません。 検索ロボットは、サイトのページが最後のインデックス作成以降に更新されたかどうかに関する情報を取得できません。 彼は何をしていますか? すべてのページにインデックスを付けます!!! そして、変化したものだけではありません。

もちろん! 多くのサイトがSitemapを使用しています。 ただし、サイトマップは推奨事項であり、検索エンジンオプティマイザーに役立ちます。 Last-Modifiedヘッダーを置き換えることはできません!



PHPでのLast-Modifiedヘッダーの設定と処理



WebサーバーがIf-Modified-Sinceヘッダーをphp-backendに渡すには、これを通知する必要があります!



たくさんのnginx + phpので

location ~ \.php$

{



if_modified_since off;



fastcgi_pass fcgi;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /< > /web$fastcgi_script_name;



fastcgi_pass_header Last-Modified;

include fastcgi_params;

}




* This source code was highlighted with Source Code Highlighter .








apache + phpの束については、

# If-Modified-Since ( if php is not installed as cgi then comment lines below)

RewriteRule .* - [E=HTTP_IF_MODIFIED_SINCE:%{HTTP:If-Modified-Since}]

RewriteRule .* - [E=HTTP_IF_NONE_MATCH:%{HTTP:If-None-Match}]




* This source code was highlighted with Source Code Highlighter .






phpがモジュールとして機能する場合、何も設定する必要はありません!



要求処理If-Modified-Sinceのシンプルなphpコード、

$qtime = isset($_SERVER[ 'HTTP_IF_MODIFIED_SINCE' ])? $_SERVER[ 'HTTP_IF_MODIFIED_SINCE' ]: '' ;



$modified = substr(gmdate( 'r' , $timestamp), 0, -5). 'GMT' ;



if ($hdr == $modified)

{

header ( "HTTP/1.1 304 Not Modified " );

header ( "Last-Modified: $modified" );

exit();

}

header ( "Last-Modified: $modified" );

//render




* This source code was highlighted with Source Code Highlighter .








symfonyでIf-Modified-Sinceリクエストを処理する方法は?



symfonyにはすでにヘッダー処理メカニズムがあります。 開発者に必要なのは、ヘッダーをsfWebResponseオブジェクトに渡すことだけです。 彼の指示の場合、フレームワークはすべて自分で行います。

$datestamp = time();

$response->setHttpHeader( 'Last-Modified' , $response->getDate($datestamp));




* This source code was highlighted with Source Code Highlighter .






通常、ページにはさまざまなコンテンツが配置されるため、最新の送信ヘッダーを設定するメソッドを作成しました。

static public function setLastModified($datestamp)

{

$response = sfContext::getInstance()->getResponse();

$request = sfContext::getInstance()->getRequest();



if (is_array($datestamp))

{

rsort($datestamp, SORT_NUMERIC);

$datestamp = $datestamp[0];

}



if (!$response->hasHttpHeader( 'Last-Modified' ))

{

$response->setHttpHeader( 'Last-Modified' , $response->getDate($datestamp));

}

else

{

$origLastModified = strtotime($response->getHttpHeader( 'Last-Modified' ));

if ($origLastModified < $datestamp)

$response->setHttpHeader( 'Last-Modified' , $response->getDate($datestamp));

}

}




* This source code was highlighted with Source Code Highlighter .






たとえば、ページに最後の3つのビデオ、最後の3つの記事、およびその他の情報が含まれている場合に使用すると非常に便利です。 データベースから各モデルをロードすることにより、メソッドを呼び出して、最終的に応答の最新の変更日を取得できます。

興味がある人のために、ヘッダー処理コードはsfCacheFilter.class.phpクラスにあります。



結論として、Last-Modifiedヘッダーを使用することは必ずしも正当化されるとは言いません。 たとえば、サイトに5000ページがあり、各ページに頻繁にコンテンツが変更される同じブロックが含まれている場合、タイトルを使用しても意味がありません。 この場合、顧客と検索ロボットに異なるヘッダーのみを提供できます。 しかし、私にとっては、ロボットを欺くことは良いことにはなりません。 まあ、またはこのブロックを削除;)。



まだ



ここでヘッダーの正しい処理についてサイトを確認できます。



<?php

$ch = curl_init();



$url = 'http://site.ru/1.php ' ;



curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_HEADER, true );

curl_setopt($ch, CURLOPT_NOBODY, true );

curl_setopt($ch, CURLOPT_HTTPHEADER, array(

'If-Modified-Since: Sun, 28 Nov 2010 15:45:53 GMT'

));



ob_start();

curl_exec ($ch);

curl_close ($ch);

$data = ob_get_contents();

ob_end_clean();





echo nl2br($data);

?>



* This source code was highlighted with Source Code Highlighter .







All Articles