web-dev-qa-db-ja.com

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

最後にスラッシュ( "/")なしで次のようなURLをリクエストしたときに、このRedirect(301)に気づきませんでした:_http://server/directory_

サーバーは、_http://server/directory/_に配置されるLocationヘッダーを含む301 Redirect Permanentヘッダーで応答します。

このライブの例をご覧ください:

ユーザーリクエスト:

_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リンクの最後にスラッシュを追加して、いくつかのリダイレクトを実行する必要がありますか?

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

13
Jonathan Gurebo

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

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

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

10
kasperd

mod_dirはこのリダイレクトを追加します。 DirectorySlash Off ディレクティブ。

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

9
200_success