web-dev-qa-db-ja.com

nginxルールを.htaccessに変換します

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に書き換えられます)

2
Kalpit

(上記のコードは/ get/5000849に書き換えられます)

上記のNginxコードは外部(301)リダイレクトであり、厳密には「書き換え」ではありません。 (ただし、おそらく後で.htaccessファイルでも書き直す必要があります。)

/index.php?action=get&id=5000849redirect/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]+を調整します。

1
MrWhite