0

ホストされたサーバー(Hostek.com)でMicrosoft-IIS/7.5を使用しています

Googleに2,820のインデックス付きリンクがある既存のサイトがあります。次のサイトでGoogleを検索すると、結果を確認できます。site:flyingpiston.comほとんどのページでは、セクション、makerid、またはbikeidを使用して適切な情報を取得しています。ほとんどのリンクは次のようになります。

flyingpiston.com/?BikeID=1068
flyingpiston.com/?MakerID=1441
flyingpiston.com/?Section=Maker&MakerID=1441
flyingpiston.com/?Section=Bike&BikeID=1234

新しいサイトでは、.htaccessを使用してURLの書き換えを行っています。新しいURLは次のようになります。

flyingpiston.com/bike/1068/
flyingpiston.com/maker/1123/

基本的には、htaccessファイルを使用して「?」を付けてリクエストを送信したいだけです。その中の疑問符は、redirect.cfmと呼ばれるcoldfusionページに直接あります。このページでは、ColdFusionを使用してカスタム301リダイレクトを作成します。ColdFusionのリダイレクトは次のようになります。

<cfheader statuscode="301" statustext="Moved Permanently">
<cfheader name="Location" value="http://www.newurl/bike/1233/">
<cfabort>

では、疑問符の付いたすべてのものを特定のページにプッシュしたい場合、htaccessファイルはどのように見える必要がありますか?これが私が試したものですが、機能していません。

RewriteEngine on
RewriteRule ^? /redirect.cfm [NS,L]

アップデート。以下のアドバイスを使用して、私はこのルールを使用しています:

RewriteRule \? /redirect/redirect.cfm [NS,L]

このリクエストをプッシュしようとするには

http://flyingpiston2012-com.securec37.ezhostingserver.com/?bikeid=1235

このページへ:

http://flyingpiston2012-com.securec37.ezhostingserver.com/redirect/redirect.cfm
4

1 に答える 1

2

試していることが機能しない理由はいくつかあります。

1つ目は、RewriteRuleが正規表現を使用し、正規表現のメタ文字であるため、文字通りの疑問符文字と一致するように?バックスラッシュ()でエスケープする必要があることです。\?

ただし、問題の2番目の部分は、RewriteRuleの正規表現がURLのファイル名部分に対してのみテストされることです。具体的にはクエリ文字列を除外します

クエリ文字列と照合するには、ルールの前の行に配置された(ただし、RewriteRuleの照合と置換の間に適用される) RewriteCondディレクティブを使用して、追加のフィルターとして機能させる必要があります。便利な点は、URLのどの部分と照合するかを指定できることです(また、非正規表現テストを使用するためのオプションもあります)。

これらすべてを念頭に置いて、リクエストをクエリ文字列と照合/書き換える最も簡単な方法は次のとおりです。

RewriteCond %{QUERY_STRING} .
RewriteRule .* /redirect/redirect.cfm

これ%{QUERY_STRING}は、正規表現がテストされる対象です(CFのCGIスコープ内のすべてがここで使用でき、他のいくつかのものも使用できます。ドキュメントの[サーバー変数]ボックスを参照してください)。

シングル.は「一致したアイテムに単一の文字が含まれていることを確認してください」とだけ言っています

現時点では、このルールは既存のクエリ文字列を保持します。破棄する場合?は、置換URLの末尾にを配置できます。(URLでクエリ文字列を使用する必要があり、古いバージョンを破棄しない[QSA]場合は、フラグを使用してください。)

反対の方向では、URLのファイル名部分が失われます。これを保持するには、自動全一致キャプチャを使用して、おそらくPATH_INFOとして置換に追加する必要があります$0

これら2つのことは一緒に提供します:

RewriteCond %{QUERY_STRING} .
RewriteRule .* /redirect/redirect.cfm/$0?

最後に、無限ループを防止する必要があります。上記のルールはクエリ文字列を削除するため、常にRewriteCondに失敗しますが、安全性を高めるために(特に、クエリ文字列を追加する必要がある場合)、追加のRewriteCondで実行できます:

RewriteCond %{QUERY_STRING} .
RewriteCond %{REQUEST_URI} !/redirect/redirect\.cfm
RewriteRule .* /redirect/redirect.cfm/$0?

複数のRewriteCondがANDとして結合され!、一致を否定します。

もちろん、RewriteRuleに必要なフラグを追加して、希望どおりに動作させることができます。

于 2012-11-08T15:12:17.950 に答える