もともとクラシックASPを使用して構築されたWebサイトがあります。約1年前、PHPで書き直されました。これにより、ファイル拡張子が変更され、一部のページがWebサイト内の新しい場所に移動されました。当然、ユーザーと検索エンジンが新しい場所を見つけることができるように、古いURLから新しいURLへの301リダイレクトを行いました。これは正常に機能します。
また、サイト所有者が独自の小さなURLを作成し、URLに含まれるGoogleアナリティクスキャンペーントラッキング変数を使用してページにリダイレクトし、キャンペーンを追跡してそのパフォーマンスを確認できるツールを構築しました。
私が抱えている問題は、キャンペーントラッキングルールが301リダイレクトと競合し、リダイレクトがまったく機能しないことです。
キャンペーントラッキングコードは次のとおりです。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /tracking.php?$1 [R=301,L]
ご覧のとおり、ファイルが存在するかどうかを確認し、存在しない場合は追跡スクリプト(tracking.php)にリダイレクトします。追跡スクリプトは追跡コードを取得し、クエリ内のGoogleアナリティクスキャンペーンコードで適切なURLにリダイレクトします文字列。
このコードにより、次のようなルールが失敗します。
redirect 301 /about.asp /about.php
redirect 301 /capabilities.asp /capabilities.php
redirect 301 /capacitors.asp /capacitors.php
トラッキングルールが「ファイルがtracking.phpへのリダイレクトを見つけられない場合」と言うように、これは一緒に機能しないことは理にかなっています。必要なのは、301リダイレクトを最初に実行し、それらのいずれも一致しない場合、追跡スクリプトにリダイレクトすることです。 301リダイレクトの下に追跡ルールを配置しても、結果は変わりません。
これは.htaccessで実行できますか?または、キャンペーンが見つからない場合、キャンペーンIDが実際にリダイレクトする必要がある古いページであるかどうかを確認し、そこから301リダイレクトを行うように、トラッキングスクリプトを変更する必要がありますか?
mod_alias
リダイレクトをmod_rewrite
ディレクティブに変換してみてください。
編集:以下の例では、同じパスの下にある古いASPファイルをPHPファイルに置き換えたと仮定しています。
RewriteEngine on
# *.asp -> *.php
RewriteRule (.*)\.asp$ /$1.php [R=301,L]
# tracking script
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /tracking.php?$1 [R=301,L]
...または、正規表現変数をスキップして、古いURIのそれぞれに明示的なリダイレクトを設定できます。
RewriteRule about\.asp$ /about.php [R=301,L]
RewriteRule capabilities\.asp$ /capabilities.php [R=301,L]
RewriteRule capacitors\.asp$ /capacitors.php [R=301,L]
編集#2:これは、遭遇するほとんどの状況をカバーする例です。
RewriteEngine on
# Changes to path + Query String Append
RewriteRule ^/path/to/old\.asp$ /path/to/new/about.php [R=301,L,QSA]
# *.asp -> *.php + Query String Append
RewriteRule ^(.*)\.asp$ $1.php [R=301,L,QSA]
# tracking script
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /tracking.php?$1 [R=301,L]