3

Zend_Cache_Backend_Staticを使用して静的ページキャッシュを設定し、アプリケーションでキャッシュされたhtmlファイルを提供しました。これはうまく機能しています。私が抱えている唯一の懸念は、$_GETパラメータを使用してファイルをキャッシュする方法にあります。提供されたURLルートにマップするフォルダー構造が自動的に作成されるため、これは、多数の$ _GETパラメーターが既存のページに意図的に追加される可能性がある場合の潜在的なセキュリティリスクですか?ディレクトリの最大深度またはファイルの最大長に達しましたか?

例:現時点では、ページをキャッシュしている/public/cache/static/ので、標準のルーター/module/controller/action/param1/val1/param2/val2または標準のクエリ文字列/module/controller/action?param1=val1&param2=val2を使用すると、次のディレクトリ構造が作成されます。

/public/cache/static/module/controller/action/param1/val1/param2/val2.html 
/public/cache/static/module/controller/action?param1=val1&param2=val2.html

この方法でディレクトリ構造を作成するためのアクセスを人々に許可することは(ただし制限されますが)、私は少し心配します。Zend_Cache_Backend_Staticと対応するZend_Cache_Frontend_Captureの両方を、Zend_Cacheファクトリ経由ではなくiniファイルで設定する必要があり、セットアップオプションがないように見えます。

デフォルトルーターを$_GET変数の数を制限するカスタムルートに置き換える場合だけでしょうか?これは可能ですか、それとも各ルートに必要な変数を正確に指定する必要がありますか(世界の終わりではなく、もう少し制限があります)

アップデート:

したがって、静的キャッシュを処理するための既存の書き換えルールは次のとおりです。

RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{DOCUMENT_ROOT}/cached/index.html -f
RewriteRule ^/*$ cached/index.html [L]

RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{DOCUMENT_ROOT}/cached/%{REQUEST_URI}\.html -f
RewriteRule .* cached/%{REQUEST_URI}\.html [L]

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]

RewriteRule ^.*$ index.php [NC,L]

リクエストが静的キャッシュのページにヒットすると、そのhtmlページが送信されます。そうでない場合は、ZendFrameworkにヒットして生成されます。

私は最初に以下を追加することができます:

RewriteCond %{QUERY_STRING} \S
RewriteRule [^\?]+ /$0? [R=301,L]

これにより、クエリ文字列が完全に消去されます。Zend FrameworkのURLパスメソッドを使用して$_GET変数を渡すことができるので、これは問題ありません(これは、非常に明示的なルートを提供することによっても制限されています)。しかし、リダイレクトせずにこれを行うことは可能ですか?

4

2 に答える 2

1

これをRewriteCondとして定義するのが理想的な方法ですが、mod_rewriteを使用してGETパラメーターの数をカウントできるかどうかはわかりません。

したがって、おそらく最善の解決策は、キャッシュされたhtmlファイルを使用するかどうかを決定するスタンドアロンのphpスクリプトにリダイレクトすることです。

<?php

if (count($_GET) >= 20) {
  require __DIR__ . 'index.php';
} else {
  require '/path/to/cache.html';
}
于 2012-02-18T17:10:19.410 に答える
0

OK、クエリ文字列を削除するRewriteRuleはリダイレクトなしで機能します。

問題(私が思うに)は、Zend_Cache_Backend_Staticが行のどこかで$ _SERVER ['REQUEST_URI']を使用しているため、元のファイル名にアクセスできることです。mod_rewriteに関する私の知識はかなりスリムで、この値が変更されていないことに気づいていませんでした。

したがって、大量のクエリ文字列によってファイルやディレクトリが作成されるのを防ぐために、次のことを行う必要がありました。

まず、標準のクエリ文字列の場合:

mod_rewriteの開始時に、リダイレクトせずにクエリ文字列を削除します。

RewriteCond %{QUERY_STRING} \S
RewriteRule [^\?]+ /$0?

次に、index.phpで、クエリ文字列を削除して、リダイレクトに一致するように$ _SERVER ['REQUEST_URI']を変更します。これは、ZFをハックする必要がなくなったことを意味します。

$queryIndex = strpos($_SERVER['REQUEST_URI'], '?');
if($queryIndex !== false) {
    $_SERVER['REQUEST_URI'] = substr($_SERVER['REQUEST_URI'], 0, $queryIndex);
}

これにより、クエリ文字列がアプリケーションによって解釈されなくなります。したがって、変数をページに渡すために、ZendFrameworkのURLパスパラメーターを使用しています。これらが過度に深いキャッシュフォルダを作成するのを防ぐために、ブートストラップでデフォルトルートをいくつかの非常に明示的に定義されたルートに置き換えました。

$frontController = Zend_Controller_Front::getInstance(); 
$router = $frontController->getRouter();

$route = new Zend_Controller_Router_Route(
    ':module/:controller/:action',
    array(
        'module' => 'default',
        'controller' => 'index',
        'action' => 'index'
    )
);

$router->addRoute('default', $route);

$route = new Zend_Controller_Router_Route(
    'article/:alias',
    array(
        'module' => 'default',
        'controller' => 'article',
        'action' => 'index',
        'alias' => ''
    )
);

$router->addRoute('article', $route);

ここでは、デフォルトルートを置き換えたため、追加のパラメーターは許可されていません。したがって、パラメータを必要とするアクションは、たとえば2番目のルートで明示的に設定する必要があります。これは、定義されたルートが多数存在する可能性があることを意味します。ありがたいことに、これは私の特定のアプリケーションには当てはまりません。

ルートを大幅に制限し、ZF URLパスを介していくつかのGETパラメータを許可する方法は、REQUEST_URIのスラッシュ数に制限を設定し、静的ページキャッシュの最大ディレクトリ深度を効果的に制限することです(以下の10)。これは、index.phpでも変更できます。

if(substr_count($_SERVER['REQUEST_URI'], '/') > 10) {
    preg_match_all("/\//", $_SERVER['REQUEST_URI'] ,$capture, PREG_OFFSET_CAPTURE);
    $_SERVER['REQUEST_URI'] = substr($_SERVER['REQUEST_URI'], 0, $capture[0][9][1]);
}
于 2012-02-20T11:44:26.177 に答える