1

こんにちは、.htaccess で 2 つのことを達成するのに苦労しています。おそらくそれぞれで同じ問題です。

またはと呼ばsite-versionれるCookie を正常に設定しています。auus

Cookie が設定されている場合、http://www.example.comhttp://www.example.com/を (内部的に) http://www.example.com/home-au.html ( cookie site-version=au の場合)。また、環境変数 SITE_VERSION=au を設定したいと考えています。

RewriteCond %{HTTP_COOKIE} site-version=(au|us) [NC]
RewriteRule ^/?$ /home-%1.html [NC,QSA,E=SITE_VERSION:%1]

問題は、RewriteRule の正規表現にあるようです。これを に設定すると.*、ループをあきらめると、環境変数が正常に設定されたように見えますが、それでもリクエストは書き換えられません。

URL がhttp://www.example.com/a-specific-page.htmlまたはhttp://www.example.com/another-specific-page.htmlで、Cookie が設定されている場合にリダイレクトしたいhttp://www.example.com/a-specific-page-au.htmlまたはhttp://www.example.com/another-specific-page-au.html、つまり-auファイル名に を追加します。(そして環境変数を設定します。)

RewriteCond %{THE_REQUEST} ^(a-specific-page|another-specific-page)\.html$ [NC]
RewriteCond %{HTTP_COOKIE} site-version=au [NC]
RewriteRule ^(.*)\.html$ /$1-au.html [QSA,E=SITE_VERSION:au]

後で htaccess でこれらの URL を再度翻訳するので、L フラグは必要ありませんが、次のことも試しました。

RewriteRule ^(.*)\.html$ index.php?q=$1-au.html [QSA,E=SITE_VERSION:au,L]

これらのテーマで多くのマイナーなバリエーションを試しましたが、書き換えをトリガーするものはありません。

編集: 私の理解に根本的なギャップがあることに気づきました。URL の書き換えにより、.htaccess を介して別のループがトリガーされるため、フラグメントではなくファイル全体を表示する必要があります。これにより、ソリューションが機能する理由が説明されますが、まだ環境変数を取得できません。

RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
RewriteRule (.*) http://www.example.com/$1 [R=301,L]


########## Set the cookie if the user selects a new country #############
#  The webpage submits the existing URL plus the site-version URL parameter.   #
#  The below strips the parameter and returns to the same URL with a cookie site-version. #
#  Unless the site-version is uk (default) in which case the cookie is deleted. #

RewriteCond %{QUERY_STRING} ^.*site-version=(au|us|za|eu)$
RewriteRule (.*) $1? [co=site-version:%1:example.com:1051200:/,R,E=SITE_VERSION:%1,L]

RewriteCond %{QUERY_STRING} ^.*site-version=uk$
RewriteRule (.*) $1? [co=site-version:uk:example.com:-1:/,R,E=SITE_VERSION:uk,L]

#####################
# If the cookie is present and the URL is either a-page.html or another-page.html append -au eg, a-page-au.html #

RewriteCond %{HTTP_COOKIE} site-version=au [NC]
RewriteRule ^(a-page|another-page)\.html$ index.php?q=$1-au.html [NC,QSA,E=SITE_VERSION:au,L]

##########################
# Normal Friendly URLs rewrite, ie, cookie not detected or it isn't one of the listed URLs #

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
4

2 に答える 2

1

私のコメントのように、RewriteCond なしで設定された最初のルールをテストしました。

RewriteRule ^/?$ /home-%1.html [NC,QSA,E=SITE_VERSION:%1]

私はこれを得ました:

http://www.example.com/ =>     http://www.example.com/home-.html

2 番目のルールセットには、目に見えるエラーがあります: %{THE_REQUEST} ^(a-specific-page|another-specific-page).html$ [NC] %{THE_REQUEST} の代わりに %{REQUEST_URI} を使用してみてください。%{THE_REQUEST} には、GET や POST などの単語が含まれます。

だからあなたはこれを試すかもしれません:

RewriteCond %{HTTP_COOKIE} site-version=(au|us) [NC]
RewriteRule ^/?$ /home-%1.html [NC,QSA,E=SITE_VERSION:%1]

RewriteCond %{HTTP_COOKIE} site-version=au [NC]
RewriteRule  ^(a-specific-page|another-specific-page)\.html$ /$1-au.html [NC,QSA,E=SITE_VERSION:au]

または、次のように R フラグを追加して、目に見えるリダイレクトを設定します。

RewriteCond %{HTTP_COOKIE} site-version=(au|us) [NC]
RewriteRule ^/?$ /home-%1.html [R,QSA,E=SITE_VERSION:%1]

RewriteCond %{HTTP_COOKIE} site-version=au [NC]
RewriteRule  ^(a-specific-page|another-specific-page)\.html$ /$1-au.html [R,NC,QSA,E=SITE_VERSION:au]
于 2013-11-09T22:43:21.073 に答える
0

完全なソリューション。これにより、次のことが行われます。

  1. URL パラメーター ?site-version を検出し、見つかった場合は、クライアントに site-version と呼ばれる Cookie を設定し、国コード (au、eu、za など) を 2 年間 (1051200 分) 保持します。次に、URL からパラメーターを削除し、ユーザーのブラウザーに元の URL を再度要求させます。

  2. ただし、site-version=uk の場合は、これが Web サイトのデフォルト設定であるため、Cookie は削除されます (coフラグの -1 を参照)。

特定のページには、それらのローカル バージョンが記述されています。国コードを URL に追加することでアクセスできます。したがって、costs.html のオーストラリア版は cost-au.html です。

  1. Cookie が検出された場合 (これは、繰り返しのアクセスであるか、上記の手順 1 のリダイレクトが原因である可能性があります)、URL が調べられます。URL がローカル バージョンのページの 1 つである場合、国コードが URL に追加されます。次に、URL は index.php に渡されます。これは、見栄えがよく、検索エンジンに適した URL を作成するための一般的な方法です。URL の書き換えにより、.htaccess を介した別の反復がトリガーされます。(Nb. 私の知る限り、これらのルールの E= フラグは、.htaccess が環境変数を介して繰り返されたときに何も達成しません。URL が変更された場合、E= フラグは事実上無効になります。何も達成しません。)

  2. Cookie が検出されると、その値は HTTP_SITE_VERSION という環境変数に格納されます。(環境変数には常に接頭辞を付ける必要があります。これは、suexec をHTTP_実行しているサーバーは、.HTTP_共有ホスト。)

  3. 私の PHP は、変更されたことを認識せずに、変更された URL、つまり cost-au.html を提供します。(参考までに、これは内部リダイレクトであるため、ブラウザの URL は cost.html です。)

  4. すべてのページに対して、それらがリストに含まれていて翻訳があるかどうかに関係なく、環境変数が設定されます。PHP は $site_version = getenv('HTTP_SITE_VERSION') でこれを検出し (Cookie と変数が設定されていないため UK の場合は false を返し、var がない場合は getenv が false を返します)、電話番号や住所などの適切なナゲットを表示します。

したがって、最終的な実用的な解決策は次のとおりです (以下の詳細を修正してください)。

RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
RewriteRule (.*) http://www.example.com/$1 [R=301,L]

########## Set the cookie if the user selects a new country #############
#  The webpage submits the existing URL plus the site-version URL parameter.   #
#  The below strips the parameter and returns to the same URL with a cookie site-version. #
#  Unless the site-version is uk (default) in which case the cookie is deleted. #

RewriteCond %{QUERY_STRING} ^.*site-version=(au|us|za|eu)$
RewriteRule (.*) $1? [co=site-version:%1:example.com:1051200:/,R,E=HTTP_SITE_VERSION:%1,L]

RewriteCond %{QUERY_STRING} ^.*site-version=uk$
RewriteRule (.*) $1? [co=site-version:uk:example.com:-1:/,R,E=HTTP_SITE_VERSION:uk,L]

#############################
# Once the URLs have been rewritten, htaccess is iterated through again - re-iterating loses the environment variable to re-set it here

RewriteCond %{HTTP_COOKIE} site-version=(au|us|eu|za|uk) [NC]
RewriteRule .* - [NC,E=HTTP_SITE_VERSION:%1]

#####################
# If the cookie is present and the URL is either a-page.html or another-page.html append -au eg, a-page-au.html #

RewriteCond %{HTTP_COOKIE} site-version=au [NC]
RewriteRule ^(a-page|another-page)\.html$ index.php?q=$1-au.html [NC,QSA,E=HTTP_SITE_VERSION:au,L]


##########################
# Normal Friendly URLs rewrite, ie, cookie not detected or it isn't one of the listed URLs #

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

必要な修正: jacouh によって提案された 2 つの変更:

  1. 一致させたい文字列を RewriteCond の代わりに RewriteRule 行に入れます。私の愚かな見落とし。

  2. URL を 2 段階で変更しないでください。新しい URL ではなく index.php?q=.. に直接移動し、Lフラグを追加してください。いずれかのルールによって URL が変更されると、htaccess 全体が繰り返されます。すべてを 1 つのステップで行うと、作業がはるかに簡単になります。

しかし、これは不完全でした。URL が書き換えられると、.htaccess を介した新しい反復がトリガーされました。これにより、すべての環境変数が削除され、ヘッダーに REDIRECT_ のプレフィックスが付けられます。

そのため、書き換えをトリガーせずに .htaccess の繰り返しに環境変数の設定を追加する必要もありました。(ルールによって URL が変更された場合に htaccess ファイルが再度反復されると、環境変数が消えます。冗長で申し訳ありませんが、これは混乱を招きます。)したがって、URL を変更しない htaccess の反復が必要です。環境変数を設定します。したがって、追加する必要があります

RewriteCond %{HTTP_COOKIE} site-version=(au|us|eu|za|uk) [NC]
RewriteRule .* - [NC,E=HTTP_SITE_VERSION:%1]

これにより、URL が書き換えられた後の反復で環境変数が設定されます。ちょっとプレスト、私のサーバーで働きました。

しかし、ロールアウトすると、書き換えが行われていましたが、変数は再び消えました。

PHP を保護するために suexec を実行しているサーバーでは、環境変数にHTTP_.

于 2013-11-12T17:15:55.313 に答える