htaccess サブドメインなしで国を書き換える

htaccess サブドメインなしで国を書き換える

URLを書き換える必要があります

us.example.com

example.com?country=us

サブドメインなし

次の 2 つのルールを試しました。

1.

RewriteRule (US|EG) ?c=$1 [NC , L]

2.

RewriteRule :\/\/(.*?).example.com ?C=$1 [NC , L]

しかし、それらは機能しませんでした。

それで、これを実行する方法はあるのでしょうか?

答え1

異なるホスト名間で URL を「書き換える」ことはできません (リバース プロキシを実装する必要があります)。また、「リダイレクト」は望ましくないと考えられます。

ただし、サブドメインとメインドメインがすべてファイルシステムの同じ領域を指している場合は、ホスト名/ドメインを変更する必要はありません。必要なのは、通常の書き換え (同じホスト上) だけです。

要求されたホストのサブドメインを確認するには、サーバー変数(つまり、 HTTPリクエストヘッダーの値)RewriteCondをチェックする条件(ディレクティブ)が必要です。HTTP_HOSTHostRewriteRule パターンURL の URL パス部分のみに一致します。

例えば:

RewriteEngine On

RewriteCond %{QUERY_STRING} !^country=
RewriteCond %{HTTP_HOST} ^(us|eg)\.example\.com [NC]
RewriteRule ^ /?country=%1 [L]

上で述べたように、これはサブドメインとメインドメインがファイルシステムの同じ領域を指していることを前提としています。これは、すべてのリクエストが単一の CMS によって管理されるシステムでは一般的です。(また、サンプル ディレクティブでホスト名を変更しようとはしていません。)

バック%1リファレンスは、要求されたホスト名のサブドメイン (この例では「us」または「eg」) を保持します。

クエリ文字列に URL パラメータが存在しないかどうかをチェックする追加条件は、country=書き換えループを防ぐためのものです。

しかし、URL パスについては何も述べていません。リクエストを処理しているファイル ( index.php?) に直接書き換える必要があります。現在の状態では、上記の「書き換え」は、mod_dir が DirectoryIndex に対して追加のサブリクエストを作成することに依存しています。


  1. RewriteRule (US|EG) ?c=$1 [NC , L]
  2. RewriteRule :\/\/(.*?).example.com ?C=$1 [NC , L]

これらのディレクティブには多数のエラーがあります。

  • あなたはこれらを試したと言いますが、間違ったスペースの中に引数を指定すると、ファイルが最初に解析されるときに、直ちに 500 内部サーバー エラーが発生します。
  • 前述のように、RewriteRule パターン(最初の引数) は URL パスのみに一致します。ホスト名は含まれません。
  • #1の正規表現はあまりにも一般的であり、「US」または「EG」に一致しますどこでも
  • 絶対URLと一致させるには(2番目の例でしようとしているように)、THE_REQUESTサーバー変数(リクエストヘッダーの最初の行を含む、リクエストを含む)と一致させる必要があります。方法)。

関連情報