web-dev-qa-db-ja.com

?blah =などのGETパラメータを使用すると、Apache Redirect301が失敗します。

顧客向けに新しいPHPサイトを構築しましたが、上位のGoogle検索結果を古いサイト構造から新しいサイト構造にリダイレクトしたいと思います。

Documentrootの.htaccessに数十のリダイレクト301を配置しましたが、正常に動作するものもありますが、他の多くの問題が発生しています。

これは正常に機能します。

Redirect 301 /nl/flash/banner_new.swf http://www.example.com/actueel/nieuws.html?action=show&f_id=152

これは機能しません! (リダイレクトが単にスキップされるため、404につながります):

Redirect 301 /nl/index.php?mID=24511&subID=0 http://www.example.com/solutions/printsolutions.html
Redirect 301 /nl/index.php?mID=24512&subID=0 http://www.example.com/support/koppeling-met-omgeving.html

リダイレクトは.htaccessファイルに混在しており、GETパラメーターを使用したリダイレクトのみが失敗しているように見えます。

回避策はありますか?失敗したリダイレクトを無視することは、お客様の選択肢ではありません。あなたの考えをありがとう。

18
Martijn Heemels

Gumboの答え 推論は正しかったが、彼のRewriteRuleを機能させることができなかった。

別のRewriteCondを追加することでそれができました。以下はテスト済みで、正常に動作します。

RewriteCond %{REQUEST_URI} /nl/index.php$
RewriteCond %{QUERY_STRING} ^mID=24511&subID=0$
RewriteRule ^.*$ http://www.example.com/solutions/printsolutions.html [L,R=301]
16
Martijn Heemels

ガンボとマルティンの両方の答えに同意する...しかし:

Martijnのタイプミスでは、REQUEST_URI条件の正規表現を開始するために「^」が必要です。

RewriteCond %{REQUEST_URI} ^/nl/index.php$

私も、GumboではなくMartijnだけを、私の.htaccessファイルがあった場所で動作させることができました。

また、リライト時にパラメータ文字列を渡したくない場合は、「?」を追加する必要があります。 URLの末尾:

RewriteRule ^.*$ http://www.example.com/solutions/printsolutions.html? [L,R=301]

それ以外の場合、Martijnのコードに従って、「URLが/nl/index.php?mID=24511&subID=0の場合は、 http://www.example.com/solutions/printsolutions.html?mID= 24511&subID = 301の永続的なリダイレクトヘッダーがあり、このURLでこれ以上ルールを処理しないでください。 "

これはあなたが望むものかもしれないし、そうでないかもしれません、そしてパラメータが理解されない場合の原則として公平であるために、それらは害を与えることなく単に無視されるので、おそらく問題ではありません。ただし、人間を新しいページにリダイレクトして「きれいなURL」が必要な場合は、パラメータ文字列を削除することをお勧めします。「?」を付けてください。宛先URLの末尾。

12
user204529

Redirect はURLパスでのみ機能します:

古いURL-pathは、スラッシュで始まる大文字と小文字を区別する(%デコードされた)パスです。 […]

したがって、URLクエリ(最初の?の後の部分から最初の#の後までの部分)はチェックされません。

しかし、 mod_rewrite を使用してそれを行うことができます:

RewriteCond %{QUERY_STRING} ^mID=24511&subID=0$
RewriteRule ^nl/index\.php$ http://www.example.com/solutions/printsolutions.html [L,R=301]
RewriteCond %{QUERY_STRING} ^mID=24512&subID=0$
RewriteRule ^nl/index\.php$ http://www.example.com/support/koppeling-met-omgeving.html [L,R=301]
12
Gumbo