web-dev-qa-db-ja.com

WordPress URLをクエリ文字列でルートディレクトリから新しいURLに一時的にリダイレクトします

この投稿には私の答えがあるようです:
。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番目のペアは大歓迎です!

5
emRae

あなたには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ファイルで「微調整」するのが難しくなります。

4
Alexis Wilke

Alexis Wilkeは本当に問題を発見しました。 urlの#038;&のhtmlコードであるという事実とともに。メールで自動変換されたため、間違ったURLに移動しました。

これを解決する方法は、WordPressプラグインを使用することでした Quick Page/Post Redirect Plugin 。リダイレクトを行ったURL部分は、/?post_type=emailから/email/fall-2017/でした。

これを.htaccessファイルで機能させるための正規表現またはフォーマットを正しく行うことができず、プラグインはそのクエリ文字列をより正確にコーディングする方法を知っていると思います。正規表現が良くなるまで、リダイレクトにプラグインを使用し続けます。

1
emRae

これを解決する方法は、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ディレクティブは不要です。このチェックは、RewriteRulepatternで行うのが最適です。 ^$(空のURLパス)。

1
MrWhite