http://olddomain.tld
(非推奨WordPressサイト)の個々のURLをhttps://newdomain.tld
を使用して.htaccess
(新しいWordPressサイト)の個々のURLにリダイレクトしようとしています。
ホームページのリダイレクトは、Redirect 301 / https://newdomain.tld
で正常に機能します(したがって、Rewriteエンジン、またはそのようなものをオンにすることを忘れていなかったことがわかります)。
ただし、他のリダイレクトはどれも正しく機能しません。例:Redirect 301 /page/ https://newdomain.tld/page/
in .htaccess
を書いた後、http://olddomain.tld/page/
がhttps://newdomain.tldpage
にリダイレクトします。つまり、リダイレクトは存在しますが、すべての場合に末尾のスラッシュが削除されます。
これは何が原因ですか?
olddomain.tld
.htaccess
のあらゆる種類のますますエキゾチックなバリエーションを試した後、最後にスラッシュがnewdomain.tld
の.htaccess
によって何らかの形でドロップされているかどうかを確認するアイデアを得ました。ここで何かがそれをやっている可能性がありますか?
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
末尾のスラッシュが「ドロップ」されている場合、これを行っている宛先サイトのWordPress構成にsomethingが存在する可能性があります。ネットワーク/ HTTPトラフィックを確認してください...どの時点で2番目のリダイレクトが表示されますか? 2番目のリダイレクトはどのHTTPステータスですか?
新しいURLを直接入力すると、末尾のスラッシュは削除されますか?
しかしながら...
Redirect 301 /page/ https://newdomain.tld/page/
に.htaccess
と書きます...
Redirect
ディレクティブはmod_aliasディレクティブです。これは、mod_rewriteの一部であるRewriteEngine
とは関係ありません。異なるApacheモジュールは独立して動作し、両方のモジュールからのリダイレクトの混在を避ける必要があります-予期しない競合が発生する可能性があります(mod_rewriteは.htaccess
のこれらのディレクティブの見かけの順序に関係なく最初に実行されるため)。
WordPressは既にmod_rewriteを使用しているため、代わりにmod_rewriteを使用するようにこれらのリダイレクトを変更し、既存のWordPressディレクティブをbeforeに移動する必要があります。したがって、たとえば:
# Home page (ie. "/")
RewriteRule ^$ https://newdomain.tld/ [R=301,L]
# Other page (ie. "/page/")
RewriteRule ^page/$ https://newdomain.tld/page/ [R=301,L]
RewriteRule
patternにはスラッシュプレフィックスがないことに注意してください(mod_alias Redirect
の場合と同様)。
ここで何かがそれをやっている可能性がありますか?
これは単にWordPressフロントコントローラーです-末尾のスラッシュを削除することはできません。しかし、おそらくWordPress構成自体にURLの正規化があるのでしょうか?
内部書き換えのみを行うため、WordPress提供.htaccess
コードには何も問題はありません。いいえ外部リダイレクトは、あなたが提供したnewdomain.tld
の.htaccess
コードで実行されています:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
末尾のスラッシュは、WordPressで設定した書き換えルールに応じて、WordPressコアによってドロップされるか、または他のサーバー構成によってドロップされます。
それがWordPressであるかどうかを確認するには、以下にアクセスしてください。
WordPress Admin Panel
=>Settings
=>Permalinks
Permalink Settings
を確認します。次に、Common Settings
で、URL構造の末尾を確認します。ほとんどの場合、末尾にスラッシュ(/
)がありません。
したがって、次のようにCustom Structure
を使用している場合:
https://newdomain.tld/%postname%
次のようにしてください:
https://newdomain.tld/%postname%/
これで問題が解決するはずです。そうでない場合、末尾のスラッシュが他の場所から来ていることを意味します。複数のプラグインがある場合は、それらを無効にしてから、1つずつ有効にして、誰が原因かを確認してください。
注:URLリダイレクトのテスト中は、必ずブラウザーのキャッシュをクリアしてください。
いずれも機能しない場合、問題は他のサーバー構成に起因しています。