15

私はこの構造を持っています: site.com/api/index.php. データを送信してsite.com/api/も問題はありませんが、次のように末尾のスラッシュがなくても API が機能する方がよいと思います: site.com/api. これにより 301 リダイレクトが発生し、データが失われます (データが転送されないため)。考えられるすべての書き直しを試みましたが、リダイレクトを回避できませんでした。これが私の現在の書き換えルールです (関係ないかもしれませんが)。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^api/(.*)$ api/index.php [L]

この URL を機能させ、末尾のスラッシュを使用せずに投稿データを維持できますか?

動作しなかったいくつかの書き換え: (すべてリダイレクト)

RewriteRule ^api$ api/index.php [L] 
RewriteRule ^api/*$ api/index.php [L]
4

2 に答える 2

13

最初にディレクトリのスラッシュをオフにする必要がありますが、末尾にスラッシュがあることが非常に重要である理由があります。

Mod_dir ドキュメント:

末尾のスラッシュ リダイレクトをオフにすると、情報漏えいが発生する可能性があります。mod_autoindex がアクティブ(Options +Indexes)DirectoryIndex、有効なリソース (たとえばindex.html) に設定されており、その URL に対して定義されている特別なハンドラーが他にない状況を考えてみましょう。この場合、末尾にスラッシュがあるリクエストはindex.htmlファイルを表示します。ただし、末尾にスラッシュがない要求では、ディレクトリの内容が一覧表示されます。

つまり、末尾にスラッシュを付けずにディレクトリにアクセスすると、デフォルトのインデックス (例: index.php) を提供する代わりに、単にディレクトリの内容が一覧表示されます。したがって、ディレクトリのスラッシュをオフにしたい場合は、末尾のスラッシュを内部的に書き直す必要があります。

DirectorySlash Off

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*[^/])$ /$1/

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^api/(.*)$ api/index.php [L]

最初のルールは、内部的にのみですが、末尾のスラッシュが最後に追加されることを保証します。ブラウザを外部的にリダイレクトする mod_dir とは異なり、内部の書き換えはブラウザには見えません。次に、次のルールが API ルーティングを行います。最初のルールにより、末尾のスラッシュが保証されます。

于 2013-09-05T00:12:34.663 に答える
0

Jon Lin が提供するソリューション (ディレクトリを指すすべての URL を再構成する) を使用したくない場合は、次のコードを使用できます (regexp の ? に注意してください - 基本的に、「api」の後の末尾のスラッシュはオプションであると述べています)。 )。私はそれをテストしていませんが、そのまま動作するはずです:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^api/?(.*)$ api/index.php [L]
于 2013-09-05T00:27:22.767 に答える