1

たぶん私は愚かなことをしているのかもしれませんが、htaccessの問題を取り除くことはできません。

ドキュメントサイトで関数名を一致させようとしていますが、理解できないエラーが発生します。私は(私が思うに)正規表現がエスケープすることを知っていること、そしてドットとバックスラッシュドットが何を意味するかを知っていることを指摘しなければなりません。

だから:私はこれらすべてを許可したい:

example.com/foofunction
example.com/foofunction.php
example.com/function.foofunction
example.com/function.foofunction.php

これらは私が試した行です。エラーの原因となるものは誤解されているので、私に何かを説明できる人に感謝します。

^function\.([A-Za-z0-9_-]+)(\.php)?$->動作しますが、function.必須になります

^(function\.)?([A-Za-z0-9_-]+)(\.php)?$->内部エラー...わかりました。ドットをエスケープしないでください。最終的には、どの文字とも一致し、機能します...

^(function.)?([A-Za-z0-9_-]+)(\.php)?$->内部エラーも!わかりました、試してみるだけで、条件付きの外側にドットを付けますか?

^(function)?\.([A-Za-z0-9_-]+)(\.php)?$->動作します、わかりました、しかしそれはドットを必須にします。ちなみに、もっとクレイジーなこと:

^(function)?.([A-Za-z0-9_-]+)(\.php)?$->ドットがエスケープされていない場合(任意の文字を許可したいとします)、内部エラーも発生します。今度はドットを個別にオプションにしようとします

^(function)?(\.)?([A-Za-z0-9_-]+)(\.php)?$->内部エラーも、私は夢中になります...

これらはこれまでの私の試みです。オプションのルックビハインドを試し、結果で更新します...とにかく、これらの正規表現が内部エラーを引き起こす理由を理解したいと思います。

そして、誰かが「htaccessの特別な正規表現の例外」リファレンスまたは私が読まなければならないようなものについて知っているなら、非常に歓迎されます。

みなさん、よろしくお願いします。

4

1 に答える 1

3

実際の関数名以外のすべてに非キャプチャグループを使用します。

^(?:function\.)?([A-Za-z0-9_\-]+)(?:\.php)?$

それを分解しましょう:

^                   # assert start of string
  (?:function\.)?   # optionally allow the string "function."
  ([A-Za-z0-9_\-]+) # capture the function name - this could be shortened to ([-\w]+)
  (?:\.php)?        # optionally allow the string ".php"
$                   # assert end of string

したがって、.htaccessは(おそらく)次のようになります。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(?:function\.)?([A-Za-z0-9_\-]+)(?:\.php)?$ doc.php?functionname=$1 [L,QSA]

重要なポイントとこの場合の実際の解決策:

ルールが1回だけ一致するようにするには、フラグと(通常は)フラグの適切な組み合わせを使用する必要があります。RewriteCond[L]

mod_rewriteは、少し直感に反する方法で動作しますが、すぐにはわかりません。一致するものがなくなるまで、ルールを繰り返し実行し続けます。したがって、上記のルールを使用するとします。

RewriteRule ^(?:function\.)?([A-Za-z0-9_\-]+)(?:\.php)?$ doc.php?functionname=$1

...そして私はこのルールに入力を提供しますfunction.myfunc.php。まず、次のように書き直されます。

doc.php?functionname=myfunc

ただし、次回は再び一致します。そしてそれは次のように書き直されます:

doc.php?functionname=doc

...そしてこれはに達するまで何度も何度も起こり続けMaxRedirects、Apacheはエラーをスローします-これはクライアント側で500応答として表示されます。

これに対する解決策は正確なユースケースによって異なりますが、一般的な解決策(上記で使用したもの)は、書き換えルールを適用する前に、要求されたファイルが存在するかどうかを確認することです。これを行うことにより、2回目の反復ではルールが適用されず、要求はさらに処理するためにフォールスルーすることが許可されます。

[L]フラグも一般的に(過剰に)使用されます。これにより、書き換えプロセスの現在の反復が停止し、次の反復で再開されます。continueこれは、PHPのループと同じことを効果的に実行します。

Apache 2.3以降、(この状況に対して)はるかに便利なフラグが使用可能になりました- [END]。これにより、ほとんどの人が期待する動作が得られます。これにより、PHP[L]の構成のように、書き換えプロセスがすぐに停止し、それ以上の反復は行われません。breakこれを使用すると、前述RewriteCondのが不要になります。ただし、これは2.3以降でのみ使用可能であるため、実行するすべての環境で使用できることが確実にわかっていない限り、安全に使用することはできません。

于 2012-12-17T12:54:28.877 に答える