サーバーでリダイレクトロジックを実装するには、通常、クライアントに特定の HTTP ステータスコードと Location ヘッダーを送信することが含まれます。ブラウザがこの応答を受信すると、Location ヘッダーで指定された URL に自動的に移動します。
一般的な方法と考慮事項の内訳を次に示します。
1. リダイレクト用の HTTP ステータスコード
リダイレクトに最も一般的に使用される HTTP ステータスコードは次のとおりです。
- 301 Moved Permanently: リソースが新しい URL に永続的に移動されたことを示します。検索エンジンは新しい URL にインデックスを更新し、クライアントはこのリダイレクトをキャッシュする必要があります。
- 302 Found (または Moved Temporarily): リソースが一時的に別の URL で利用可能であることを示します。検索エンジンは通常インデックスを更新せず、クライアントはこのリダイレクトをキャッシュすべきではありません。
- 307 Temporary Redirect: これは 302 の HTTP/1.1 の後継です。リダイレクト時にリクエストメソッドを変更すべきではないことを明示的に述べています。
ほとんどの永続的なリダイレクトでは、SEO の目的で 301 が推奨されます。一時的なリダイレクトでは、302 または 307 が一般的です。
2. サーバーサイド実装の例
正確な実装は、使用しているサーバーサイドテクノロジーによって異なります。
a) Node.js (Express.js)
const express = require('express');
const app = express();
// 永続的なリダイレクト
app.get('/old-path', (req, res) => {
res.redirect(301, '/new-path');
});
// 一時的なリダイレクト
app.get('/another-old-path', (req, res) => {
res.redirect('/another-new-path'); // デフォルトは 302
});
// ステータスコード付きの手動リダイレクト
app.get('/manual-redirect', (req, res) => {
res.writeHead(301, {
'Location': '/final-destination'
});
res.end();
});
app.listen(3000, () => {
console.log('Server listening on port 3000');
});
b) Python (Flask)
from flask import Flask, redirect, url_for, abort, Response
app = Flask(__name__)
@app.route('/old-path')
def old_path():
return redirect(url_for('new_path'), code=301)
@app.route('/new-path')
def new_path():
return "Welcome to the new path!"
@app.route('/another-old-path')
def another_old_path():
return redirect('/another-new-path') // デフォルトは 302
@app.route('/another-new-path')
def another_new_path():
return "This is another new path!"
@app.route('/manual-redirect')
def manual_redirect():
response = Response(status=301)
response.headers['Location'] = '/final-destination'
return response
@app.route('/final-destination')
def final_destination():
return "You reached the final destination!"
if __name__ == '__main__':
app.run(debug=True)
c) PHP
<?php
// 永続的なリダイレクト
if ($_SERVER['REQUEST_URI'] === '/old-path') {
header("HTTP/1.1 301 Moved Permanently");
header("Location: /new-path");
exit();
}
// 一時的なリダイレクト
if ($_SERVER['REQUEST_URI'] === '/another-old-path') {
header("Location: /another-new-path"); // デフォルトは 302
exit();
}
// ... 残りの PHP コード
?>
d) Apache (.htaccess)
Apache Web サーバーの場合、リダイレクトは通常 .htaccess ファイルまたはメインのサーバー構成で設定できます。
# 永続的なリダイレクト
Redirect 301 /old-path /new-path
# ドメインのリダイレクト
RedirectMatch 301 ^/old-domain/(.*)$ http://www.new-domain.com/$1
# より複雑なリダイレクトのための RewriteRule
RewriteEngine On
RewriteRule ^old-path-regex$ /new-path-target [R=301,L]
e) Nginx
Nginx Web サーバーの場合、リダイレクトはサーバーブロックで構成されます。
server {
listen 80;
server_name example.com;
# 永続的なリダイレクト
location = /old-path {
return 301 /new-path;
}
# 一時的なリダイレクト
location = /another-old-path {
return 302 /another-new-path;
}
# ドメイン全体のリダイレクト
server_name old-domain.com;
return 301 $scheme://new-domain.com$request_uri;
# ... その他の設定
}
3. 主要な考慮事項
- SEO: 検索エンジンのランキングを維持するために、永続的な変更には 301 を使用します。
- ユーザーエクスペリエンス: リダイレクトは迅速かつシームレスである必要があります。リダイレクトチェーン (最終的な宛先に到達する前の複数のリダイレクト) は、ページの読み込みを遅くする可能性があるため避けてください。
- セキュリティ: オープンリダイレクトの脆弱性を防ぐために、ユーザー提供の入力をリダイレクトする際には注意してください。リダイレクト URL を常に検証およびサニタイズしてください。
- 相対 URL と絶対 URL: 同じドメイン内のリダイレクトには相対パス (例:
/new-path) を使用するか、異なるドメインへのリダイレクトには絶対 URL (例:https://www.example.com/new-path) を使用できます。 - ログ記録: 監視とデバッグのために、サーバーがリダイレクト、特に 301 を記録していることを確認してください。
- テスト: すべてのリダイレクトロジックが期待どおりに機能し、無限ループや不正な宛先を作成しないことを確認するために、徹底的にテストしてください。