web-dev-qa-db-ja.com

Apacheのデフォルトのディレクトリインデックスファイルを使用している場合、URLから末尾のスラッシュを削除するにはどうすればよいですか?

静的HTMLファイルで構成されるブログを提供するためにApacheを使用しています。現在、ブログは次のようなかなり標準的なURL構造を使用しています。

/2010/03/21/my-awesome-blog-post/

ファイルにマップします

/2010/03/21/my-awesome-blog-post/index.html

apacheのmod_dir

末尾のスラッシュを削除して、次のようなURLにしたい

/2010/03/21/my-awesome-blog-post

同じように動作します(リダイレクトされません)。 Apacheでそれを行う方法はありますか?

(URLがwithスラッシュも引き続き機能するようにしたいことに注意してください。)

(さらに注意:私はApacheの DirectorySlash ディレクティブについて何かを見ましたが、それが私が望んでいることをしているとは思いません…それについてはよくわかりません。)

7
mipadi

常にmod_rewriteを使用して、末尾のスラッシュなしでディレクトリ名をdirname/index.htmlにリダイレクトできます。 RedirectCondsを使用して、URLが末尾のスラッシュまたは.htmlで終わる場合にリダイレクトが行われないようにし、ブログ投稿URLにのみ適用されるようにすることができます。

例を挙げましょう。少し時間がかかります。

# Trailing slashes and .html suffix
RewriteCond !/$
RewriteCond !\.html$

# Check if it's actually a dir and if index.html exists
RewriteCond %{REQUEST_URI} -d
RewriteCond %{REQUEST_URI}/index.html -f

# Rewrite anything that gets through (Probably insecure, but you get the idea)
RewriteRule ^(.*)$ $1/index.html

Edit:RewriteRuleにリダイレクトエラーコードを追加するMattのソリューションと組み合わせることもできます。また、最後のRedirectRuleにする必要があります。詳細は mod_rewriteのドキュメント を参照してください。

6
user75753

Apache Rewrite Guideには 「末尾のスラッシュ問題」の章 (少し下にスクロール)があり、一般的に末尾のスラッシュに関する問題を解決する方法を説明しています。

ただし、レンダリングされたページでリソース(画像、スタイルシートなど)が相対リンクで使用されている場合、ディレクトリには末尾のスラッシュが必要であると記載されています。スラッシュなしでは機能しません。

「この微妙な問題の解決策は、サーバーに末尾のスラッシュを自動的に追加させることです。これを正しく行うには、外部リダイレクトを使用する必要があるため、ブラウザーは後続の画像などを正しくリクエストします。内部書き換えのみを行った場合、これはディレクトリページに対しては機能しますが、ブラウザがインラインオブジェクトを要求するため、相対URLを使用してこのページに画像が含まれている場合は失敗します。たとえば、/〜quux/foo/index内のimage.gifの要求.htmlは外部リダイレクトなしで/~quux/image.gifになります!」

12
Axel Knauf

DirectorySlash の定義を読みましたか?

DirectorySlashディレクティブは、mod_dirは、ディレクトリを指すかどうかを示すURLを修正する必要があります。

通常、ユーザーがディレクトリを指す末尾のスラッシュなしでリソースを要求した場合、mod_dirは彼を同じリソースにリダイレクトしますが、いくつかの正当な理由により末尾にスラッシュが付きます。

  • ユーザーは最終的にリソースの正規URLをリクエストしています
  • mod_autoindexは正しく動作します。リンク内のパスを出力しないため、間違ったパスを指します。
  • DirectoryIndexは、末尾のスラッシュで要求されたディレクトリに対してのみ評価されます。
  • HTMLページ内の相対URL参照は正しく機能します。

まあ、この効果を望まず、上記の理由が当てはまらない場合は、次のコマンドでリダイレクトをオフにできます。

# see security warning below!
<Location /some/path>
DirectorySlash Off
SetHandler some-handler
</Location>
2
Tyrael

URLからindex.phpを削除するには、.htaccess(Apacheではmod_rewrite)ファイルに2行だけを書き込みます。ルールを.htaccessに書き込む前に、Apacheサーバーでmod_rewriteが有効(RewriteEngine On)になっていることを確認してください。ほとんどの場合、Linuxサーバーではmod_rewriteが有効になっていますが、Windowsサーバーの場合、ホスティング担当者に連絡してmod_rewriteを有効にする必要がある場合があります。これはphpinfo()で確認できます。

以下は、URLからindex.phpを削除するルールです。

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /([^/]+/)*index.php HTTP/ 
RewriteRule ^(([^/]+/)*)index.php$ http://www.%{HTTP_Host}/ [R=301,NS,L]

リダイレクト301は「完全に移動」を意味するため、ほとんどの検索エンジンはURLからindex.phpを削除します。

2
Matt

同じ問題がありましたが、mod_aliasを使用してサブサイトを設定していました。結局のところ、スラッシュを付けずに2番目のエイリアスを作成して、正しく機能するようにする必要がありました。このようなものに見えました:

Alias /forum/ "/var/www/forum"
Alias /forum "/var/www/forum"

<Directory "/var/www/forum">
    Options FollowSymlinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

Ubuntuでは、/ etc/Apache2/mods-enabled/alias.confファイルを次の行で編集してから、Apacheを再起動する必要がありました。この答えはウェブのどこにも見つかりませんでした。 mod_rewriteが機能せず、DirectorySlashコマンドも役に立たなかったので、私は自分でそれにつまずきました。私はDrupalインストールの下のサブサイトとして非Drupalプログラムを追加していました。これは、最初からこのすべての狂気を引き起こしたものです...

1
John K

エイリアスを試してみてください: http://httpd.Apache.org/docs/2.0/mod/mod_alias.html

0
pors