Apache2-URLのディレクトリの末尾に「/」がない場合の301リダイレクト


13

末尾にスラッシュ( "/")を付けずにこのようなURLをリクエストしたときに、このRedirect(301)に気付いていません。 http://server/directory

サーバーは、Locationヘッダーがに位置する301 Redirect Permanentヘッダーで応答しますhttp://server/directory/

この実例をご覧ください:

ユーザーリクエスト:

GET /social HTTP/1.1
( http://192.168.1.111/social )

Apacheサーバー応答:

HTTP/1.1 301 Moved Permanently
Location: http://192.168.1.111/social/

ユーザーリクエスト:

GET /social/ HTTP/1.1
( http://192.168.1.111/social/ )

Apacheサーバー応答:

HTTP/1.1 200 OK

Apache access.log:

192.168.1.130 - - [05/Apr/2014:22:06:47 +0200] "GET /social HTTP/1.1" 301 558 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:27.0) Gecko/20100101 Firefox/27.0"
-
192.168.1.130 - - [05/Apr/2014:22:06:47 +0200] "GET /social/ HTTP/1.1" 200 942 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:27.0) Gecko/20100101 Firefox/27.0"

/ social /ディレクトリにはindex.htmlファイルが含まれています。

Apacheソフトウェア:Apache/2.2.22 (Ubuntu)
ディレクトリオプション:Options Indexes FollowSymLinks MultiViews

だから、私の質問は次のとおりです。なぜApacheはこれをしているのですか?そして、リダイレクトを防ぎ、index.html直接送信する方法は?クライアントは2つのリクエストを送信する必要がありますが、これは本当に不要です。また、一部のクライアントはリダイレクトを許可せず、最後のスラッシュ(「/」)なしではサイトにアクセスできません。

リダイレクトを無効にしたくありません。サーバーがリダイレクトなしで直接応答を送信することを望んでいません。要求するときでさえ/social

Apacheはそれらのリクエストをリダイレクトするように設計されていますか?サーバーはリダイレクトせずにデータを送信できますか?mod_rewriteこれを防ぐためにを使用すべきですか?または別の構成?または、このようにして、すべてのhtmlリンクの最後にスラッシュを追加し、いくつかのリダイレクトに対応する必要がありますか?

皆さんはどう思いますか?


これを無効にする理由を明確にする必要があると思います。/socialあなたの例では、リダイレクトに代わる唯一の正解は404で応答することです。
–HåkanLindqvist 14

私はそれを無効にしたくない、ただリダイレクトを防ぐ。サーバーにindex.htmlリダイレクトなしで出力したい
ジョナサングレボ14

「これ」とは、正しくないURLから正しいURLへのリダイレクトを伴う通常の動作を指していました。たとえばからのコンテンツを提供するのが悪い考えになる理由のいくつかについては、@ kasperdからの回答を参照してください/social。(また、一般的に、複数のURLで同じコンテンツを提供することは通常望ましくありません。)
HåkanLindqvist 14

回答:


10

リダイレクトなしでデータを送信すると、相対リンクが破損します。場合はhttp://server/directory含まれfile、そのための完全なURLは次のようになりますhttp://server/directory/file。のよう<a href="file">に指定されたリンクhttp://server/directory/filehttp://server/directory/、ベースURLがの場合にポイントしますが、ベースURLのみのhttp://server/directory場合はhttp://server/file代わりにポイントしますが、これは意図した結果ではありません。

Apacheは、リダイレクトではなくURLに応じて2つの異なる方法でディレクトリリストを生成できます。ただしindex.html、ディレクトリにファイルがある場合は機能しません。その代わり、Apacheは両方のケースで機能するアプローチを使用しています。

これは新しい動作ではなく、10年前にApacheは同じように動作していました。リダイレクトを処理できないクライアントは、これまでに修正されているはずです。ただし、リダイレクトを処理できないクライアントの場合、Apacheは、代わりにたどることができるリンク付きの小さなhtmlファイルを送信する必要があります。


これは質問に答えません。相対リンクが壊れる可能性があることは正しいです。しかし、誰かが末尾のスラッシュなしでパスのコンテンツを配信したい場合、たとえば、POSTリクエストがWebサービスに送信された場合、その理由があります。Webサービスには相対リンクはなく、リダイレクトによりPOST本体が失われます。
博士フーマンチュ

9

mod_dirこのリダイレクトを追加し、DirectorySlash Offディレクティブで無効にすることができます。

ただし、末尾のスラッシュリダイレクトを無効にすると、一部のページが破損する可能性があることに注意してください。返されるページに相対リンクが含まれる場合、末尾のスラッシュなしでページが提供されると、それらのURLは異なる方法で解決されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.