RewriteRuleにより、ページが2回リロードされます

apache mod-rewrite url-rewriting
RewriteRuleにより、ページが2回リロードされます

ページ用に2つの異なるRewriteRulesを作成しました。

# Enable URL Rewriting
RewriteEngine on

# exclude followed stuff
RewriteRule ^(js|img|css|favicon\.ico|image\.php|anprobe|content|libs|flash\.php|securimage)/ - [L,QSA,S=2]

# conditions (REQUEST dont point @ file|dir|link)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-F
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l

# rules
RewriteRule ^(?!index\.php)brillen/(.*(brillen)|360|neu)/(.*)([a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}(?!\.))(.*)$     /index.php/brillen/$1?art_id=$4&$5&%{QUERY_STRING}      [NS,QSA,L]
RewriteRule ^(?!index\.php)(.*)$                                                            /index.php/$1                                   [NS,QSA,L]
  1. そして、私はすべてのリクエストにある奇妙な問題に遭遇しています
    ページが内部で2回読み込まれるため、dbアクションとメールディスパッチも2回実行されるという問題が発生します。

誰もそれについてのアイデアを持っていますか?

前もって感謝します!

*注1:*要求されたすべてのリソースは有効であり、ブラウザーのリソーストラッキングに従って利用できます。

*注2:*問題の原因は、PATH_INFOの保持と後処理にありますか? (/index.php/$1 ⇒ /index.php/foo/bar / …​)

  6  0


ベストアンサー

書き換えエンジンは、単一のHTTPリクエストを2回実行することはできません*。 ApacheのHTTPリクエストを静的ファイル、プロキシ関数、またはリクエストに変更を加えたモジュール(PHPなど)にルーティングします。 ただし、リクエストを複製して、apacheに2回与えることはできません。

「2回実行」の問題が発生する可能性があるのは、* empty image url bug *に見舞われることです。 実際、これは実際にはバグではなく、HTMLの機能(少なくともHTML5より前)およびURL解析の機能です。

*空のGET url *をどこかに取得した場合、HTMLでは、ブラウザーは同じパラメーターを使用して同じクエリ(現在のページを提供したクエリ)を再送信する必要があると記述されています。 これにより、POST要求が2回発生する可能性があります(要求された最初のページがPOSTであった場合)。 これらの空のGET URLはどこにありますか? ほとんどの場合、次のいずれかを取得します。

 (in the HTML)

or:

url() (in the css)

or:

 (in the HTML headers)

ファビコンクエリに関する@Jonの回答もお読みください。 wgetまたはtelnet 80クエリを使用して、ブラウザの動作なしで結果を常にテストする必要があります。

更新: http://www.nczonline.net/blog/2010/03/16/empty-string-urls-in-html-a-followup/ [このブログ]で利用可能なHTML5の追加を含む詳細な説明とフォローアップ最新のブラウザではこの動作を削除する必要があります。

8


私は同じ問題を抱えていた(またはそう思った)。 これは、favicon.icoのリクエストが原因でした。これは、書き換えルールでは考慮していませんでした。

1


私はこれを追加しなかったという事実のために、URLの書き換えをいくつか行い、スクリプトが2回ロードされていたため、同じ問題が発生しました:

RewriteRule ^(js|img|css|favicon\.ico)/ - [L,QSA,S=2]

これにより、スクリプトの2回のロードが停止します。それは私の問題を解決しました。

1


タイトルとURLをコピーしました