NginxブロックをApache(.htaccess)ファイルに変換しようとしていますが、実現できません。これを手伝ってくれませんか
location = /index.php {
if ($arg_a = get) {
return 301 /$arg_a/$arg_b;
}
}
location = /home.php {
return 301 /$arg_bool;
}
action = getの場合、従来のWebサイトのURLは次のようになります。
/index.php?action=get&id=5000849
(上記のコードは/ get/5000849に書き換えられます)
(上記のコードは/ get/5000849に書き換えられます)
上記のNginxコードは外部(301)リダイレクトであり、厳密には「書き換え」ではありません。 (ただし、おそらく後で.htaccess
ファイルでも書き直す必要があります。)
/index.php?action=get&id=5000849
のredirect/get/5000849
から.htaccess
に、.htaccess
ファイルの先頭近くで次のような操作を行います。
RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^action=(get)&id=(\d+)
RewriteRule ^index\.php$ /%1/%2 [R=302,L]
get
部分は、一定であるように見えるため、後方参照を使用する代わりにハードコーディングされている可能性があります。後方参照を使用すると繰り返しが節約されますが(これが私の好みです)。
REDIRECT_STATUS
環境変数に対するチェックは、リダイレクトループを回避することです。Iassumeには、すでにというディレクティブがあるためです。後で設定ファイルのindex.php
にリクエストを書き換えます。 (?)
%1
と%2
は、最後に一致したCondPattern(前のRewriteCond
ディレクティブ)でキャプチャされたグループへの後方参照です。
このリダイレクトは、SEOを維持するために古いURL構造をリダイレクトするためにのみ使用する必要があります。これは、サイトの機能に不可欠なものであってはなりません。
注意:キャッシュの問題を回避するために、302(一時)リダイレクトでテストしてください。そして、正常に機能していることが確実な場合にのみ、301(永続的)に変更してください。テストする前に、ブラウザのキャッシュをクリアする必要があります。
PDATE:
home.php?bool=contact
は/contact
にリダイレクトされます
2番目の部分については、同じ原則が適用されますが、URLパラメーターが2つではなく1つしかない点が異なります。例えば:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^bool=([a-z]+)
RewriteRule ^home\.php$ /%1 [R=302,L]
これは、例の<contact>
が常にa-z(小文字)であると想定しています-例のように。必要に応じて正規表現[a-z]+
を調整します。