2

http://www.netairspace.com/photos/photo.php?photo=3392のような汚い URL があります。http://www.netairspace.com/photos/OH-LTU/Finnair_Airbus_330-202X/OUL_EFOU_Oulu/photo_3392/のようなことをしたい(そして、後でhttp://www.netairspace.com/pic/3392のような短い URL をサポートする) /しかし、私はそれを省略します)。

そこで私はスクリプト photo_seo_url.php を用意しました。このスクリプトは、写真 ID を取得し、SEO URL を構築し、リダイレクトを行います (テスト用に 302、満足できる場合は 301)。次に、古い URL を呼び出すときに .htaccess mod_rewrite ルールを追加することを計画しました。

  • 古い URL は内部で photo_seo_url.php に書き換えられます。
  • photo_seo_url.php は SEO URL に 301/302 リダイレクトします
  • SEO URL は、元の photo.php に内部的に書き換えられます。

そうすれば、理論的には、SEO URL のメリットを享受しながら、古い URL を自由に廃止することができます。

これらは私が使用したルールです:

RewriteEngine on
RewriteRule ^photos/.*/photo_([0-9]+)/?$ photos/photo.php?photo=$1 [NC,L]
RewriteCond %{QUERY_STRING} photo=([0-9]+)
RewriteRule ^photos/photo\.php$ photos/photo_seo_url.php?photo=%1 [NC,L]

しかし、それは無限のリダイレクト ループに入ります。これらの 2 つが外部リダイレクトではなく内部書き換えを行っているのはなぜですか?それとも私が見逃しているのですか?

新しいファイル showphoto.php を追加して、元の photo.php をインクルードするだけで問題を解決し、2 行目を変更しました。

RewriteEngine on
RewriteRule ^photos/.*/photo_([0-9]+)/?$ photos/showphoto.php?photo=$1 [NC,L]
RewriteCond %{QUERY_STRING} photo=([0-9]+)
RewriteRule ^photos/photo\.php$ photos/photo_seo_url.php?photo=%1 [NC,L]

しかし、元のバージョンが無限ループに陥る理由を理解したいと思います。何かを見逃したり、誤解したりしました。私のアプローチは健全ですか?

4

2 に答える 2

3

あなたの質問に答えるために、なぜこのループが発生するのですか? これは、たとえば、SEO URI で起こることGET /photos/OH-LTU/Finnair_Airbus_330-202X/OUL_EFOU_Oulu/photo_3392/です。

  • ルール 1 が起動し、これを に変換してGET /photos/photo.php?photo=3392、内部リダイレクトをトリガーし、.htaccessファイルのスキャンを再開します。

  • 次に、ルール 2 が起動し、これを に変換してGET photos/photo_seo_url.php?photo=339内部リダイレクトをトリガーし、ファイルのスキャンを再度開始し.htaccessます。

  • それ以上の一致は発生しないため、これはスクリプトに渡され、スクリプトphotos/photo_seo_url.phpは 302 to/photos/OH-LTU/Finnair_Airbus_330-202X/OUL_EFOU_Oulu/photo_3392/を実行し、ブラウザはリダイレクト ループを検出します。

必要なのは、内部リダイレクトの後でもルール 2 の発火を防ぐために、ルール 1 の発火です。これを行う 1 つの方法は、END (次のパスで REDIRECT_END に変換される) などの環境変数を設定し、これが設定されている場合はルールをスキップすることです。

RewriteEngine on
RewriteBase   /

RewriteRule   ^photos/.*/photo_([0-9]+)/?$ photos/photo.php?photo=$1 [NC,E=END:1,L]

RewriteCond   %{ENV:REDIRECT_END}:%{QUERY_STRING}   ^:photo=([0-9]+)$
RewriteRule   ^photos/photo\.php$          photos/photo_seo_url.php?photo=%1 [NC,L]

noredir別の方法として、書き換えられた URI にダミーのパラメーターを追加し、次を追加する方法があります。

RewriteCond   %{QUERY_STRING}   !\bnoredir

元の 2 番目のルールに。ただし、photo.phpこれは無視する必要があります。お役に立てれば :-)

于 2012-06-06T15:28:19.757 に答える
2
RewriteEngine on
RewriteRule ^photos/.*/photo_([0-9]+)/?$ photos/photo.php?photo=$1&rewritten [NC,L]

RewriteCond %{QUERY_STRING} !rewritten
RewriteCond %{QUERY_STRING} photo=([0-9]+)
RewriteRule ^photos/photo\.php$ photos/photo_seo_url.php?photo=%1 [NC,L]
于 2012-06-06T10:02:05.687 に答える