パラメータの長さが255を超える書き換えられたURLは機能しません


12

mod_rewriteを使用して、次のようにURLを書き換えています。

http://example.com/1,2,3,4/foo/

.htaccessでこれを行うことにより:

RewriteEngine On
RewriteRule ^([\d,]+)/foo/$ /foo.php?id=$1 [L,QSA]

「1,2,3,4」が255文字より長い文字列に変わる場合を除き、Apacheは「403 Forbidden」を返します。

foo.php?id=1,2,3,4非常に長いid文字列であっても、直接アクセスするのに問題はありませんが、これは私にとって選択肢ではありません。

調整すべきApacheやその他の設定はありますか?

更新:RewriteLogLevel 9でRewriteLogをオンにしました。短いID文字列では、ログファイルに複数の行が記録されます。しかし、id文字列が255文字を超える場合、もログに記録されません(mod_rewriteが実行されていないようです?)。

この質問がおもしろい/役に立つと思ったら、賛成してください。


これは正規表現の問題でしょうか?書き換えられたリクエストが255文字を超える文字列に対して正しいことを確認しましたか?そうでない場合は、おそらく、書き換え前および書き換え後のリクエストを投稿できます。
トムジェドルズ

3
mod_rewriteのロギングを有効にしてRewriteLogRewriteLogLevel何が一致し、実際にどのように書き換えられているかを確認できます。私はそれだけで255文字にコピーされている推測$1し、両端がアップされていることをidApacheが403を返すように、クライアントは、参照を許可されていないことを、私はコードを見ていないが、それはそれはApacheが操作することができ固定256バイトバッファ内の後方参照(256番目は終端NULL用に予約されています)。
ジェームズ・スニーリンガー

問題の更新を参照してください-長い
パラメータ

回答:


8

ファイルシステムの制限に直面していると思いますか?

最大ファイル名の長さは255バイトで、apacheまたはmod_rewriteルールがファイルが存在するかどうかをチェックすると、オペレーティングシステムによってエラーがapacheに返されます。

.htaccessファイルに何らかのルールを設定した場合、問題を回避するには遅すぎます。Apacheはすでにファイル名を統計しようとし、ファイルシステムエラー「(36)ファイル名が長すぎます」をスローして、403エラーを返します。

たぶん、アプリ内のURLパターンを変更できます。スラッシュからスラッシュまで最大255文字まで。

編集:この問題に対する詳細な回答はこちらご覧ください。私はそこから私のものを借りました。


はい、現時点ではこれですべてです。回避策や調整を希望しています。
philfreo

3
:Microspinoは、あなたのように見えますが、ここで@Jeffクラークの答えからあなたの答えの一部を切り取って貼り付けserverfault.com/questions/120397/...。その答えにハイパーリンクする必要があります。そうすれば、彼は悪名高くなります。
ステファンLasiewski

@Stefan lasieswski:そのとおりです、参照を追加しました。
microspino

...、私が意味することは、非常に長いURLがさえリライトエンジンによってピックアップされていないことを説明するための唯一の方法かもしれない-そう、あなたがしている思考は多分Apacheは関係なく、要求されたファイルをstatをしようとしている
HorusKol

はい、これは私の考えですが、一般的に、多くの理由で非常に長いURLとファイル名を持つことは避けるべきだと思います。そのため、ファイル名が長すぎない場合は、URLパターンの一部を変更することをお勧めします。
microspino

2

この制限について同様の質問がここにあります

基礎となるファイルシステムの制限に直面している可能性があります

.htaccess構成のどこかでREQUEST_FILENAMEを使用しているかどうかはわかりません。そのため、提供されたソリューションが機能するかどうかはわかりません。


それは理にかなっていますが、いや、私はそうではありません。質問を編集して、.htaccessファイル全体を含めました。他のアイデア?
フィルフレオ

httpd.apache.org/docs/trunk/rewrite/tech.htmlの「Apache mod_rewrite Technical Details」によると、「mod_rewriteはURLをURLに、URLをファイル名に、さらにファイル名をファイル名に書き換えますが、APIは現在URL-to -ファイル名フック。」実際のファイルをヒットしていなくても、URLからファイル名へのフックがOSリソースの制限に達していますか?
ステファンLasiewski

0

間違いなく興味深い質問です。mod_securityを実行し、もしそうなら、それなしで試しましたか?おそらく、長いパス名や、エンコードされていないコンマが含まれる長いパス名が好きではないのでしょうか?^^

GmonCが書いたように、本能的にはurlパスまたは少なくともその個々のセグメント、またはファイルシステムの解釈の制限のように感じますが。また、クエリ文字列に長い部分がある通常のURLが正常に機能する理由も説明できます。

以前のASP.NETでは、リクエストパスの制限が最大260文字かそれ以上だったと思います。


質問の更新を参照してください。いいえ、mod_securityファイルが/usr/include/apache2/または/usr/lib/apache2/modules/にありませんが(mod_rewriteはそこにあります)、インストールされていないと仮定します。
-philfreo

0

HTTPサーバーを変更しますか?その場合、apacheではなくnginxを検討してください。

そして、http: //wiki.nginx.org/NginxHttpRewriteModuleを使用します


本当に?Apacheでこれを行う方法はありませんか?
フィルフレオ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.