web-dev-qa-db-ja.com

パラメータ長が255を超える書き換えられたURLが機能しない

私はこのようにURLを書き換えるためにmod_rewriteを使用しています:

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」を返します。

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

Apacheやその他の調整が必要な設定はありますか?

[〜#〜] update [〜#〜]:RewriteLogLevel 9でRewriteLogをオンにしました。短いID文字列を使用すると、ログファイルに数行表示されます。しかし、id文字列が255文字を超える場合、nothingがログに記録されます(mod_rewriteが実行されていないように見えますか?)。

この質問が興味深い/役に立ったと思われる場合は、投票してください。

13
philfreo

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

ファイル名の最大長は255バイトで、Apacheまたはmod_rewriteルールがファイルの存在を確認すると、オペレーティングシステムによってエラーがApacheに返される場合があります。

.htaccessファイルにルールを追加した場合、問題を回避するには遅すぎます。 Apacheはすでにファイル名をstatしようとし、ファイルシステムエラー「(36)File name too long」をスローし、403エラーを返します。

アプリ内のURLパターンを変更できるかもしれません。スラッシュからスラッシュまでの最大255文字。

編集:この問題の詳細な回答については ここ を参照してください。そこから借りました。

8
microspino

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

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

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

2
GmonC

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

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

以前のASP.NETでは、リクエストパスの制限が260文字程度であったと思います。

0
Oskar Duveborn

Httpサーバーを変更してもよろしいですか?そこでApacheの代わりにnginxを検討してください。

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

0
JavaRocky