2

mod_rewrite を使い始めたばかりです。これは、複数の言語をサポートする非常に基本的な構造化された Web サイトに使用するものです。

RewriteEngine on
ErrorDocument 404 /error404.php

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z]{2})/([^/]+)$ $2.php?lang=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z]{2})/$ index.php?lang=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z]{2})$ index.php?lang=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ $1.php [L]

私の考えでは、言語は URl の先頭に示され、2 文字 (az または AZ) である必要があります。その後、文字列と同じファイル名で .php だけが添付された php ファイルを参照する文字列があります。言語は GET 変数 ( ?lang=en) として追加されます。

したがって、URl は次のよう/en/indexになり、次に にリダイレクトされindex.php?lang=enます。

URl が言語ではなく直接文字列で始まる場合、GET 変数は文字列に付加されません。たとえば/index、 を参照する必要がありますindex.php。文字列がない場合は、インデックスをデフォルトとして使用する必要があります。

ここまでは順調ですね。正常に動作します。文字列を入力しただけで (言語に 2 文字を使用するかどうかに関係なく)、サイトに移動する代わりに、常に 500 内部サーバー エラーが表示されerror404.phpます。また、.htaccess のこの行 (404) を削除しても、同じエラーになります。

したがって、.htaccess の他の行に何か問題があり、このエラーの原因になっていると思います。

どんな助けでも大歓迎です!

4

2 に答える 2

3

ルールがループしています。一見すると、前回のように見えます。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ $1.php [L]

この URL がhttp://your.domain.com/blahあり、ファイルblah.phpが存在しないとします。これが起こっていることです。

  1. URI = blah, !-f は true、ファイルではありません
  2. URI = blah, !-d は true、ディレクトリではありません
  3. URI = blah、への内部書き換えblah.php
  4. blah!= blah.php、ルールの書き換えループ
  5. URI = blah.php!-f は true、ファイルではありません
  6. URI = blah.php!-d は true、ディレクトリではありません
  7. URI = blah.php、への内部書き換えblah.php.php
  8. blah.php!= blah.php.php、ルールの書き換えループ

これは、書き換えエンジンが十分になり、500 サーバー エラーを返すまで続きます。

ここでは、次の 2 つのいずれかを行うことができます。

  1. この種のものを回避するのは簡単です。ただし、ループを必要とするルールに違反します。あなたのルールにはそのようなものは見当たらないので、(少なくとも今のところ)これを行うのは安全です。これをルールの先頭に追加するだけです:

    RewriteCond %{ENV:REDIRECT_STATUS} 200
    RewriteRule ^ - [L]
    
  2. php ファイルが実際に存在するかどうかを確認するためのプリエンプティブ チェックを実行します。

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}.php -f
    RewriteRule ^([^/]+)$ $1.php [L]
    
于 2012-09-17T16:45:48.453 に答える
1

Helmut、これを試してください (最後のルールが 500 内部エラーの理由であり、これにはルール 2 と 3 をマージするという @DaveRandom の提案も含まれます):

RewriteEngine on
ErrorDocument 404 /error404.php

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z]{2})/([^/]+)$ $2.php?lang=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z]{2})/?$ index.php?lang=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9]+)$ $1.php [L]
于 2012-09-17T16:44:19.707 に答える