1

.htaccess に次の行があります

RewriteRule ^folder/(.*)$ /folder/?value=$1 [L]

に何かがあると、常に 500 内部エラーが発生しhttp://website.com/folder/valueます。

単純に変更すると

RewriteRule ^folder/(.*)\.html$ /folder/?value=$1 [L]

http://website.com/folder/value.html$_GET に value.html が設定されていると、適切に送信されます。

value、value.com、value-4、otheritemなどなんでも受け付けられるようにしたいです。

私の正規表現が毎回 500 Internal Server Error'ing である理由についてのアイデアはありますか?

4

3 に答える 3

2

ルールがループしているため、おそらく 500 個のエラーが発生しています。ルールのターゲットはパターン自体に一致します (/folder/?value=value一致^folder/(.*)$する前にクエリ文字列が削除されるため、一致します)。ルールに適用する条件を含めてみてください。たとえば、次のようになります。

RewriteCond %{REQUEST_FILENAME !-f
RewriteCond %{REQUEST_FILENAME !-d
RewriteRule ^folder/(.*)$ /folder/?value=$1 [L]

または:

RewriteCond %{REQUEST_URI} !^/folder/?$
RewriteRule ^folder/(.*)$ /folder/?value=$1 [L]

しかし、技術的に@Sukuが提案したことはうまくいくはずです:

RewriteRule ^folder/(.+)$ /folder/?value=$1 [L]

私のテスト Apache インスタンスでは、上記のすべてが whileRewriteRule ^folder/(.*)$ /folder/?value=$1 [L]ループで動作します (そして 500 を返します)。

于 2013-01-13T03:39:07.257 に答える
1

/folder形式に関係なく、両方とvalue(キー「値」の値) を動的文字列として扱うこのアプローチを試すことができます。

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI}  .*/([^/]+)/([^/]+)/?   [NC]
RewriteRule .*       %1/?value=%2      [L]

次のような URL を内部的にマップします。

http://website.com/anyfolder/anyvalueまた

http://website.com/any/number/of/folders/anyfolder/anyvalue

に:

http://website.com/anyfolder/?value=anyvalue

もちろん/anyfolder、マップされた URL に存在する必要があります。存在しないと、404 エラーが発生します。

このルール セットは、実サーバーで問題なくテストされました。

于 2013-01-13T06:05:21.180 に答える
1

このルールで何が起こるかを次に示します。

RewriteRule ^folder/(.*)$ /folder/?value=$1 [L]
  • 要求されたURLはパターンに一致し、次のよう/folder/testに書き換えられます。/folder/?value=test
  • [L]フラグのため書き換え停止

ただし、パス/ファイル名が変更された (/folder/testになった/folder/) ため、mod_rewrite は別の反復を実行します。

  • 書き換えられたURL/folder/?value=testはパターンに一致し、次のように書き換えられます。/folder/?value=
  • 繰り返す

他のコメント/回答で述べたように、変更*する+と問題が解決するはずです。存在し、含まれている場合/folder/index.phpは、1 行追加する必要があります。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^folder/(.+)$ /folder/?value=$1 [L]

何が起こるかというと、書き換えた後、Apache は既存のディレクトリのデフォルト ドキュメントを提供し、それが別の書き換えの反復を開始します。この条件により、mod_rewrite が に/folder/index.php?value=test戻るのを防ぎ/folder/?value=index.phpます。

于 2013-01-14T18:18:19.390 に答える