255 文字の URL 制限を回避するために、mod_rewrite を変更して {REQUEST_FILENAME} を回避するにはどうすればよいでしょうか?

255 文字の URL 制限を回避するために、mod_rewrite を変更して {REQUEST_FILENAME} を回避するにはどうすればよいでしょうか?

この回答によると:mod_rewrite の URL の最大長は 257 文字ですか?mod_rewrite を使用する場合、ファイル システムに基づいて最大 255 文字のハード制限があります。

受け入れられた回答によると、解決策は 2 つあります。

  1. アプリケーションの URL 形式を、各スラッシュ間の最大文字数が 255 文字になるように変更します。
  2. 書き換えルールを Apache 仮想ホスト設定に移動し、REQUEST_FILENAME を削除します。

最初の方法は使えないので、2番目の方法を考えようと思っています。

要求どおりに、Apache 仮想ホスト構成に Rewrite ルールを設定しました。ただし、REQUEST_FILENAME を削除しても Web アプリケーション フレームワーク (Dragonfly) が動作し続ける方法がわかりません。

以下は、.htaccess から Apache の仮想ホスト設定ファイルに移動した書き換えルールの部分です。

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f [OR]

# if don't want Dragonfly to process html files comment
# out the line below (you may need to remove the [OR] above too).
RewriteCond %{REQUEST_FILENAME} \.(html|nl)$

# Main URL rewriting.
RewriteRule (.*) index.cgi?$1 [L,QSA]

{REQUEST_FILENAME} を削除しようとしましたが、さまざまな方法でフレームワークが壊れてしまいます。{REQUEST_FILENAME} を使用せずにこれを書き直すにはどうすればよいでしょうか?

答え1

以下の 3 行は、Apache にファイルシステムをチェックしてファイルが存在するかどうかを確認するように指示します。

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f [OR]

最初のものは「URI がディレクトリでない場合」を意味します。2 番目は「URI がリンクでない場合」を意味します。3 番目は「URI がファイルでない場合」を意味します。

これらの行を削除またはコメントアウトすると、Apache は「.html」または「.nl」で終わらないすべてのファイルに以下の書き換えを適用し、最初にファイルが存在するかどうかを確認するためにファイル システムをチェックしなくなります。

上記の 3 行には目的があります。これらの行は、実際のファイル、ディレクトリ、またはシンボリックリンクをドキュメント ルートに追加し、誰かがそのファイル、ディレクトリ、またはシンボリックリンクを要求した場合に、Apache がそれを通常どおり処理し、書き換えを行わないようにするためにあります。実際のファイルをドキュメント ルートに追加しないことがわかっている場合は、副作用なしで安全にコメント アウトできます。


より良い変更としては、次のように 3 行の上に新しいルールを追加することが考えられます。

RewriteRule (.*[^/]{255}.*) index.cgi?$1 [L,QSA]

これは、スラッシュの間に 255 文字を超える単一の文字列を持つ URI をインターセプトし、ファイルシステムをチェックせずに直接書き換えに送ります。[L] オプションは、このルールに一致する場合、Apache がそれ以上のルールをチェックしないことを保証します。この正規表現に一致する URI は有効なファイル パスではないため、実際のファイルにマップされる URI をインターセプトする危険はありません。

アップデート:

少なくとも 255 文字の長さの URI に一致する正規表現。

RewriteRule (.{255}) index.cgi?$1 [L,QSA]

答え2

私の場合は、次の方法が動作します (Apache 2.2.21 を搭載した Debian のデフォルトの仮想ホストでテスト済み)。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} (.{255}) [OR]
RewriteCond %{REQUEST_FILENAME} \.(html|nl)$ [OR]
RewriteCond %{REQUEST_FILENAME} !-d [OR]
RewriteCond %{REQUEST_FILENAME} !-l [OR]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /index.cgi?$1 [L,QSA]

関連情報