web-dev-qa-db-ja.com

301リダイレクトと競合する自家製URL短縮リダイレクト

もともとクラシック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リダイレクトを行うように、トラッキングスクリプトを変更する必要がありますか?

11
John Conde

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]
5
danlefree