web-dev-qa-db-ja.com

スラッシュのドロップによるリダイレクトに関するhtaccessの問題

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>

追伸それは thisthisthisthisthis または this .

3
gesher

末尾のスラッシュが「ドロップ」されている場合、これを行っている宛先サイトの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]

RewriteRulepatternにはスラッシュプレフィックスがないことに注意してください(mod_alias Redirectの場合と同様)。

ここで何かがそれをやっている可能性がありますか?

これは単にWordPressフロントコントローラーです-末尾のスラッシュを削除することはできません。しかし、おそらくWordPress構成自体にURLの正規化があるのでしょうか?

1
MrWhite

内部書き換えのみを行うため、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リダイレクトのテスト中は、必ずブラウザーのキャッシュをクリアしてください。

いずれも機能しない場合、問題は他のサーバー構成に起因しています。

1
Fayaz