.html拡張子を単に非表示にしたい静的なサイトが少数あります。
/foo
は静的ファイル/foo.html
を取得します/foo
というURLが表示されますクライアントは、mydomain.com/foo
ではなくmydomain.com/foo.html
スタイルでブックマークを送信できます。
とても簡単に聞こえますが、以前にmod_rewrite
を喜んで使用しました(WordPressまたはリダイレクト用))が、これは私が思っていたものをクラックするのがはるかに難しいことを証明しています。本当に明らかなものが欠けていますが、どこにも解決策が見つからず、私は一日中解決しました!
独自のサーバーを実行しているので、これが最適な場所であればどこにでも行くことができます。
補遺
以下で確認したソリューションは正常に機能しました。その後、しばらくサイトを実行した後、2つの問題に気付きました。
すべてのページがスタイルなしで表示され始めました。リロード、キャッシュのクリアなどを行いましたが、スタイルはありません。以前にこの問題が発生したことがあり、ソースを見つけることができません。
ディレクトリと「gallery」という名前のhtmlファイルがあるため、/ galleryリンクには、htmlファイルの代わりにディレクトリ一覧が表示されます。私はそれをソートできるはずですが、さらなるヒントは歓迎します:-)
このルールを試してください:
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule !.*\.html$ %{REQUEST_FILENAME}.html [L]
これにより、.html
を追加するときに既存のファイルにマッピングできるすべてのリクエストが書き換えられます。
以前の回答では、要求されたパスがディレクトリであるかどうかはチェックしません。
要求されたパスがディレクトリである場合(元の質問で述べられているように)、書き換えを行わない完全な書き換え条件を次に示します。
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d # is not directory
RewriteCond %{REQUEST_FILENAME}\.html -f # is an existing html file
RewriteRule ^(.*)$ $1.html # rewrite index to index.html
SEOフレンドリーで二重のコンテンツを回避するには、.html URLをリダイレクトします。
# Redirects domain.com/file.html to domain.com/file
RewriteCond %{REQUEST_FILENAME} !-d # is not directory
RewriteCond %{REQUEST_FILENAME}\.html -f # is an existing html file
RewriteCond %{REQUEST_URI} ^(.+)\.html$ # request URI ends with .html
RewriteRule (.*)\.html$ /$1 [R=301,L] # redirect from index.html to index
スクリプトで同じことが必要な場合は、ここをご覧ください: .htaccessを使用して.php URL拡張を非表示にするにはどうすればよいですか?
Webサイトが仮想ホスト/ドキュメントルートで構成されている場合、受け入れられたソリューションは機能しません。
私が使用した解決策があります:
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.html -f
RewriteRule !.*\.html$ %{REQUEST_FILENAME}.html [L]
この投稿をご覧ください http://alexcican.com/post/how-to-remove-php-html-htm-extensions-with-htaccess/ まだ試していませんが、デモはかなり説得力があるようです。
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
.html
リクエストから.*.html
拡張を削除するには、root/.htaccess
で次のスクリプトを使用できます。
RewriteEngine On
RewriteBase /
#1) externally redirect "/file.html" to "/file"
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.html [NC]
RewriteRule ^ %1 [R=301,L]
#2) rewrite "/file" back to "/file.html"
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*?)/?$ $1.html [NC,L]
次に、ファイルをディスクに保存できる例を示します。
foo.html.php
ただし、ブラウザでは、
foo.html
これを機能させるには、既存のリクエストと一致するように少し変更し、.html
拡張子。
# These are so we do not need the .php extension
RewriteCond %{REQUEST_FILENAME} (\.xul|\.html|\.xhtml|\.xml)$',
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.php -f',
RewriteRule ^(.*)$ $1.php',
うわー、私はウェブ上に非常に多くの「解決策」が存在するような問題をめったに見ませんでした。たとえば、ここで示したソリューションの多くは、仮想ホストでは機能しません。
多くの相互参照と読書の後、「自分に合った」独自のソリューションを提供したいと思います。うまくいけば、それもあなたのために働く。最初から作成しませんでした。私は他のすべての貢献に触発されました(それらのほとんどは修正なしで「私のために」働きませんでしたが)。
RewriteEngine on
#if foo requested, return foo.html contents
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}\.html -f
RewriteRule ^(.*)$ $1.html [L]
#redirect foo.html to foo
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^(.+)\.html$ $1 [R,L]
[R]
フラグはデフォルトで一時的な(302)リダイレクトを行います。永続的なリダイレクトが必要な場合は、R
の代わりにR=301
を使用します。