コンテンツ ネゴシエーション( ) を使用して拡張子のない+MultiViews
URL にアクセスする Apache 2.x Web サーバー(例: allow vs. or ) がある場合、実際に誰かがそれらの拡張子を使用しようとしたときに、 301 パーマネント リダイレクトを発行するにはどうすればよいでしょうか?/foo
/foo.php
/foo.html
目標は、すべての道路がsans extensionバージョンの URLにつながるようにすることなので、 に/foo/
進み/foo
、 に/foo.html
進み/foo
ます。トリッキーであることを証明しているのは後者です。(使用例: インターネット上には、まだ拡張機能を使用している従来の URL が散在しています。これらを永続的にリダイレクトする必要があります。)
canonical link 要素がありますが、付随するスライドでも、最初にサーバー側でリダイレクトを行う方がよいという提案があります。
私はこれをmod_rewriteで試してきましたが、いわばApacheが「私を打ち負かした」ようです。拡張子が単に無視されているかのようです。「必要ありません。カバーしました」と Apache は言います。ただし、永続的なリダイレクトを処理できないため、拡張機能と非拡張機能の両方が許可されます。望ましい結果ではありません。:)
これが一例です。小文字で構成される 2 ~ 4 文字のファイル名と、テスト ファイルが に配置されている場合、/foo/file.html
恒久的に にリダイレクトし/foo/file
ます。
Options +MultiViews
RewriteEngine on
...
RewriteRule ^foo/([a-z]{2,4}).html/$ /foo/$1 [R=301,L]
/foo/file/
にリダイレクトし/foo/file.html/
ます/foo/file
が、もちろんそうで/foo/file.html
はありません。次のようなルールを試してみると ($ の前に末尾のスラッシュがないことに注意してください):
RewriteRule ^foo/([a-z]{2,4}).html$ /foo/$1 [R=301,L]
... Apache はあたかも次のルールであるかのように動作するため、リダイレクトが多すぎます。
RewriteRule ^foo/([a-z]{2,4})$ /foo/$1 [R=301,L]
私自身の利益のためにあまりにも賢くしようとして、ネストされた括弧も試しました。
RewriteRule ^foo/(([a-z]{2,4}).html)$ /foo/$2 [R=301,L]
サイコロはありません。ループ都市をリダイレクトします。
本当に良いのは、この種のものを「まとめて」キャプチャすることです。そのため、これらすべての特殊なケースが htaccess に浮かんでいることはありません。
別の SO の質問は、html ファイルを処理する単一のケースについてこれに対処し始めましたが、提案された解決策では、表面上はContent Negotiationを無効にする必要があります。私の場合)。
追加のクレジット: 末尾のスラッシュも避けたいので、誰かが試みた場合/foo/
(それ自体が .html または .php ファイルである可能性があります) は、/foo
何があっても実行されます。最初のルール (上記) でこれが達成されますが、それは +MultiViews によるものだと思います。ここでの使用には疑問DirectorySlash
があります。リスクがあり、価値がなくなる可能性があるからです。