この投稿には私の答えがあるようです:
。htaccessを使用して古いWordPress URL(クエリ文字列を含む)を新しいURLにリダイレクトするにはどうすればよいですか?
ただし、これはWordPressの以前の書き換えルールではうまく機能しないようです。私がやりたいのは、このページからの一時的なリダイレクト(302)です:https://example.com/?post_type=email#038;p=14207
このページへ:https://example.com/email/fall-2017/
.htaccessファイルの関連するmod_rewriteルールとその順序は次のとおりです。
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
# BEGIN Query String URL redirects
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} ^post_type=email#038;p=14207$
RewriteRule .* https://example.com/email/fall-2017/? [R=302,L]
</IfModule>
# END Query String URL redirects
2番目のペアは大歓迎です!
あなたには2つの問題があると思います。
1つは、書き換えが順番にチェックされ、最も制約の少ないものの後に、より制約の多いものを配置します(つまり、クエリ文字列を使用したリダイレクトが最初になります)。
第二に、クエリ文字列に関する別の問題があります。アンカーが含まれています。サーバーに送信されることはありません(#...
の後はクライアント側のみです)。
そのため、書き換えではそのハッシュを考慮することができず、サーバーに到達しないため、チェックできません。ただし、重要な情報があるように見えるので、サーバーに送信される前に変換方法がわからない限り、正しく実行できるとは思いません。 1つの可能性は、%23として書き込まれることです。
さて、あなたが良いアイデアを得るためには、ログを調べて、そのページがヒットしたときにそこに到達するものを確認する必要があります。
ここに、あなたが見るものの例を示します。
smsfromme.com:443 173.14.79.185--[14/Sep/2017:01:38:36 +0000] "GET/api/1/message/next HTTP/1.1" 404 141 "smsfromme.com" "-" " Dalvik/1.6.0(Linux; U; Android 4.4.2; SM-G386T Build/KOT49H) "TLSv1 ECDHE-RSA-AES128-SHA
クエリ文字列はパスの後に表示されるため、GET
の後に次のようなものが表示されます。
"GET /?post_type=email#038;p=14207" ...
または、あなたが私たちに与えた情報を与えると思うので、これ:
"GET /?post_type=email" ...
リダイレクトが機能する場合、パスの後のコードは302
になります。
アンカー(#
の後のデータ)を取得し、それをページのデータのGETで変換する(つまり、通常AJAXリクエストと呼ばれる)JavaScriptを持っている可能性が非常に高いです。毎回ページ全体をリロードするのを避けるのはクールなトリックです。しかし、.htaccess
ファイルで「微調整」するのが難しくなります。
Alexis Wilkeは本当に問題を発見しました。 urlの#038;
は&
のhtmlコードであるという事実とともに。メールで自動変換されたため、間違ったURLに移動しました。
これを解決する方法は、WordPressプラグインを使用することでした Quick Page/Post Redirect Plugin 。リダイレクトを行ったURL部分は、/?post_type=email
から/email/fall-2017/
でした。
これを.htaccessファイルで機能させるための正規表現またはフォーマットを正しく行うことができず、プラグインはそのクエリ文字列をより正確にコーディングする方法を知っていると思います。正規表現が良くなるまで、リダイレクトにプラグインを使用し続けます。
これを解決する方法は、WordPressプラグインクイックページ/ポストリダイレクトプラグインを使用することでした。リダイレクトを行ったURL部分は
/?post_type=email
から/email/fall-2017/
でした。
.htaccess
ファイルでこれを機能させるために、正規表現またはフォーマットを正しく実行できませんでした
必要なコード/正規表現は、最初に投稿したものと非常に似ていますが(より簡単です)、行く必要がありますbefore WordPressフロントコントローラー(@AlexisWilkeが示唆するように)。
例えば:
# Special redirects
RewriteCond %{QUERY_STRING} ^post_type=email$
RewriteRule ^$ /email/fall-2017/? [R=302,L]
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
<IfModule>
ラッパーまたは追加のRewriteEngine
ディレクティブは不要です。また、REQUEST_URI
サーバー変数に対してチェックするRewriteCond
ディレクティブは不要です。このチェックは、RewriteRule
patternで行うのが最適です。 ^$
(空のURLパス)。