2010-12-15 8 views
0

サブドメインに基づいて自分の(Rails)アプリケーション内のページをキャッシュします。特定のアクションのページは、/ public/cache /(サブドメイン)/にキャッシュされます。アプリケーションはPhusion Passengerを使用してApacheで実行されています。キャッシュは正常に動作しています。問題は、Apacheがキャッシュされたページをピックアップしていないように、Railsをバイパスしていないことです。私の書き換えルールは間違っていて、私はそれらを修正するのに役立つ必要があります。キャッシュされたページのMod書き換えルール

私は多くの一例として、使用している、に位置提案:あるhttps://github.com/yeah/page_cache_fu#readmeは、次のように:

RewriteMap uri_escape int:escape 
<Directory /var/www/example.com/current/public> 

    RewriteEngine On 
    RewriteCond %{REQUEST_METHOD} GET [NC] 
    RewriteCond %{DOCUMENT_ROOT}/cache/%{HTTP_HOST}%{REQUEST_URI}%{QUERY_STRING}.html -f 
    RewriteRule ^([^.]+)$ cache/%{HTTP_HOST}/$1${uri_escape:%{QUERY_STRING}}.html [L] 

    RewriteCond %{REQUEST_METHOD} GET [NC] 
    RewriteCond %{DOCUMENT_ROOT}/cache/%{HTTP_HOST}/index.html -f 
    RewriteRule ^$ cache/%{HTTP_HOST}/index.html 

これに伴う問題は、それがディレクトリを期待しているように思われる

完全なhttpホスト(キャッシュ/サブドメインではなくcache/subdomain.example.comを探しています)。

編集:Railsアプリをcache/subdomain.example.comにキャッシュするように変更しても、Apacheはまだそれを使用しないので、サブドメインの面だけではなく間違っているようです。

誰かが正しいルールを思いついてくれたら助かりますか?

編集(2):

私は(ちょうど作業開始ポイントを取得しようとする)以下に私の書き換えを簡素化している

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com$ [NC] 
RewriteCond ^stats$ cache/%1/stats.html [L] 
私はこれがあることを http://abc.example.com/statsを引き起こすと思うだろう

http://abc.example.com/cache/abc/stats.html

書き換えられません。私はまた、RewriteLogエントリを追加し、私はそれがhttp://abc.example.com/var/www/example.com/current/public/cache/abc/stats.htmlにリダイレクトしようとしていると思うと思う。これは、ブラウザに表示される 'L'オプションと一緒に 'R'オプションを追加すると、さらに確認されます。http://abc.example.com/var/www/....etc私。パブリックに直面している部分だけではなく、完全なドキュメントルートを追加しているようです。

もちろん、上記の結果は、ブラウザに404エラーが返されることです。

私のルールにはまだ間違いがありますか?

編集:実際はバグです。

http://code.google.com/p/phusion-passenger/issues/detail?id=563

+0

ここで有効にしようとしているリダイレクトの例を教えてください。私。 「URLに移動すると、「OtherURL」にリダイレクトされたい。正確にしてください。ありがとう。 – AgentConundrum

+0

エージェント、これは私が使用したい2つの主なインスタンスです:http://abc.example.comに移動すると、http://abc.example.com/cache/にリダイレクトされます。 abc/index.html; http://abc.example.com/statsに移動すると、http://abc.example.com/cache/abc/stats.htmlにリダイレクトされます。いずれの場合も、キャッシュされたファイルが存在する場合のみです。どちらの場合も、ブラウザに表示されるURLは変更されないことをお勧めします。 –

答えて

1

それが動作するはずのようにさてさて、このに見えるが、それはしていません。私はこれで多くのテストをしましたが、問題はRewriteRuleの^([^.]+)$のようです。さて、私はこれをGoogleで行いました。それは一般的なパターンなので、問題の内容を理解できません。私が知っているのは、のパターンをRewriteRuleに使用すると、ルールは失敗します。私が^([^.]+)に変更すると、うまくいくようです。

mod_rewriteの経験が豊富な方には、にどうぞよろしくお願いします。

編集:私はちょうど^([^.]+)$に問題があることを実現:

キャッシュを構築しているので、その後、「通常の」ファイルがいつもの場所に存在しています。これには、サーバーに/fileを要求すると、設定によっては「fileが存在しないので、デフォルトの拡張子「.html」を試してみてください。それが消えてfile.htmlが見つかります。今すぐRewriteRuleにアクセスすると、^([^.]+)$正規表現はfile.htmlと一致し、fileになります。

^([^.]+)$には、「文字列の先頭に続けて、できるだけ多くの非周期文字が続き、その後に文字列の終わりが続きます」というピリオドが含まれていないため、fileに対して正常に機能します。 ^[^.]+fileと一致しますが、正規表現で文字列の末尾(つまり$)を見つけようとすると、代わりに.htmlが見つかり、失敗するため、file.htmlに対して失敗します。

理由^(.*)$作品は、おそらくの(.*)$部分の間に存在することができる文字が無いので、「任意の文字の多くは」.*一致するため、唯一の.*は、文字列の全体になることが保証だということです正規表現。 [^.]+ではそうではありません。


サブドメインを抽出するには、RewriteCondを逆参照する必要があります。基本的に、RewriteCondで参照を取得する(つまり、括弧内に何かをカプセル化する)場合、それらの参照はすぐ後に続くRewriteRuleで使用できます。例えば

私はこれを書いた場合、:

RewriteCond %{HTTP_HOST} ^([^.]+)\.example.com 

を次に括弧は、サブドメインをキャプチャするだろう - 私は次の行にするRewriteRuleを書くために、次にしたら()

[^.]+周りに注意してください、上記のテキストは %1としてアクセス可能になります。

だからあなたのRewriteRuleは次のようになります。

RewriteRule ^([^.]+) cache/%1/$1${uri_escape:%{QUERY_STRING}}.html [L] 

に役立ちます願っています。

+0

代理人、これにお時間をいただきありがとうございます。私はあなたの結論が何であるかは分かりません。 $記号を削除すればうまくいくと言っていますか? FWIWについて考えると、クエリパラメータを持つページをキャッシュしないため、2回目の書き換えルールだけが必要になると思います。サブドメインを解析するために、そのファイルがその名前のディレクトリにあることを示すためにルールの$ 1が続くように、 "^([^。] +)"という形式が必要です。 –

+0

@Ken:混乱していると思います^([^。] +) 'はサブドメインを解析していませんRewriteRuleは要求されたファイルに対して動作しますが、言い換えれば 'http:// sub.example.com/file.html'をリクエストすると、RewriteRuleはそのパターンを' file.html'と照合します。 – AgentConundrum

+0

[OK]をクリックすると、サブドメインを取得してリライトする方法が決まります。 ^/$ {cache} /%{HTTP_SUBDOMAIN} /index.html( '/'が要求された場合)のようなものが必要ですが、HTTP_SUBDOMAINのような変数はないと思います。 –