0

ページごとに、いくつかの古いドメインから 1 つの新しいドメインにページをリダイレクトしようとしています。

ページ 1: http://www.example.org/default.asp?id=1はhttp://www.example2.org/newpage.html ページ 2: http://www.example2.org/defaultにリダイレクトします。 asp?id=2はhttp://www.example.org/contact.htmlにリダイレクトします

...等々。すべての古いページは、特定の新しいページにリダイレクトされます。

次の行に沿って .htaccess に何かを書き込もうとしました

Redirect 301 http://www.example.org/default.asp?id=1 h-tp://www.example.org/newpage.html
Redirect 301 http://www.example2.org/default.asp?id=2 h-tp://www.example.org/contact.html

しかし、これまでのところ運がありません。mod_alias が有効になっています...

また、次のように RewriteCond と RewriteRule を使用してみました。

RewriteCond %{HTTP_HOST} example.org
RewriteRule default.asp?id=1 http://www.example.org/newpage.html [NC,L,R=301]
...

言い換えれば、3 つのサイト/ドメインを 1 つのサイトにマージするとともに、ID ベースからエイリアス ベースへのページごとのリダイレクトを実行したいと考えています。

有用な解決策があることを願っています。前もって感謝します!

4

4 に答える 4

3

RedirectディレクティブはURL パスでのみ機能し、URLのホストまたはクエリでは機能しません。

しかし、それはmod_rewriteで可能です:

RewriteCond %{HTTP_HOST} =example.org
RewriteCond %{QUERY_STRING} =id=1
RewriteRule ^default\.asp$ http://www.example.org/newpage.html [NC,L,R=301]

コメントで既に述べたように、ID からエイリアスへのマッピングに書き換えマップを使用できます。

1 foo-page
2 bar-page
3 baz-page
…

宣言 (ここRewriteMapでは単純なプレーン テキスト ファイル):

RewriteMap id-to-alias txt:/absolute/file/system/path/to/id-to-alias.txt

そして最後にアプリケーション:

RewriteCond %{HTTP_HOST} =example.org
RewriteCond %{QUERY_STRING} ^(([^&]*&)*)id=([0-9]+)&?([^&].*)?$
RewriteCond ${id-to-alias:%3}&%1%4 ^([^&]+)&(.*)
RewriteRule ^default\.asp$ http://www.example.org/%1.html?%2 [NC,L,R=301]

これにより、残りのクエリも保持されるはずです。それを望まない場合:

RewriteCond %{HTTP_HOST} =example.org
RewriteCond %{QUERY_STRING} ^(([^&]*&)*)id=([0-9]+)&?([^&].*)?$
RewriteCond ${id-to-alias:%3} .+
RewriteRule ^default\.asp$ http://www.example.org/%0.html? [NC,L,R=301]
于 2009-09-14T13:12:07.827 に答える
1

mod_rewriteの良い代替手段は、最も使いやすい言語を使用して、スクリプトにロジックを配置することです。単純なフロントコントローラーにリダイレクトするすべてのURLをポイントします。

RewriteRule ^default.asp$ /redirect.php [L]
RewriteRule ^another/path/to_some_file.ext$ /redirect.php [L]

そして、redirect.phpで:

<?php
if ($_SERVER['SCRIPT_URL'] == '/default.asp'){
    $map = array(
        1 => '/newpage.html',
        2 => '/contact.html'
    );
    if (isset($_GET['id'])){
        $id = $_GET['id'];
        if (isset($map[$id])){
            header('HTTP/1.1 301 Moved Permanently', true, 301);
            header('Location: http://'.$_SERVER['HTTP_HOST'].$map[$id]);
            exit;
        }
    }
}
// ... handle another/path/to_some_file.ext here, or other domains, or whatever ...

// If we get here, it's an invalid URL
header('HTTP/1.1 404 Not Found', true, 404);
echo '<h1>HTTP/1.1 404 Not Found</h1>';
echo '<p>The page you requested could not be found.</p>';
exit;
?>
于 2009-09-19T08:27:29.060 に答える
0

さらに情報を追加するだけ

OPのリダイレクトディレクティブはおそらく間違った形式です-関連するapacheドキュメントページから:

Redirectディレクティブは、クライアントに新しい場所でリソースを再フェッチするように要求することにより、古いURLを新しいURLにマップします。

古いURLパスは、スラッシュで始まる大文字と小文字を区別する(%デコードされた)パスです。相対パスは許可されていません。新しいURLは、スキームとホスト名で始まる絶対URLである必要があります。例:

Redirect /service http://foo2.bar.com/service

だからそれはそれを作るでしょう:

Redirect 301 /default.asp?id=1 http://www.example.org/newpage.html

お役に立てば幸い

于 2009-09-19T08:47:53.653 に答える
-1

httpd.conf で:

RedirectPermananent URL1 URL2

于 2009-09-14T13:10:19.110 に答える