web-dev-qa-db-ja.com

Apache mod_rewriteで.html拡張子を非表示にする方法

.html拡張子を単に非表示にしたい静的なサイトが少数あります。

  • uRL /fooは静的ファイル/foo.htmlを取得します
  • ブラウザにはまだ/fooというURLが表示されます

クライアントは、mydomain.com/fooではなくmydomain.com/foo.htmlスタイルでブックマークを送信できます。

とても簡単に聞こえますが、以前にmod_rewriteを喜んで使用しました(WordPressまたはリダイレクト用))が、これは私が思っていたものをクラックするのがはるかに難しいことを証明しています。本当に明らかなものが欠けていますが、どこにも解決策が見つからず、私は一日中解決しました!

独自のサーバーを実行しているので、これが最適な場所であればどこにでも行くことができます。

補遺

以下で確認したソリューションは正常に機能しました。その後、しばらくサイトを実行した後、2つの問題に気付きました。

  1. すべてのページがスタイルなしで表示され始めました。リロード、キャッシュのクリアなどを行いましたが、スタイルはありません。以前にこの問題が発生したことがあり、ソースを見つけることができません。

  2. ディレクトリと「gallery」という名前のhtmlファイルがあるため、/ galleryリンクには、htmlファイルの代わりにディレクトリ一覧が表示されます。私はそれをソートできるはずですが、さらなるヒントは歓迎します:-)

41
Dave Everitt

このルールを試してください:

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule !.*\.html$ %{REQUEST_FILENAME}.html [L]

これにより、.htmlを追加するときに既存のファイルにマッピングできるすべてのリクエストが書き換えられます。

48
Gumbo

以前の回答では、要求されたパスがディレクトリであるかどうかはチェックしません。

要求されたパスがディレクトリである場合(元の質問で述べられているように)、書き換えを行わない完全な書き換え条件を次に示します。

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拡張を非表示にするにはどうすればよいですか?

33

Webサイトが仮想ホスト/ドキュメントルートで構成されている場合、受け入れられたソリューションは機能しません。

私が使用した解決策があります:

RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.html -f
RewriteRule !.*\.html$ %{REQUEST_FILENAME}.html [L]
12
Gael Lafond

この投稿をご覧ください 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]
4
Syed Priom

.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]
3
starkeen

次に、ファイルをディスクに保存できる例を示します。

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',
1
gahooa

うわー、私はウェブ上に非常に多くの「解決策」が存在するような問題をめったに見ませんでした。たとえば、ここで示したソリューションの多くは、仮想ホストでは機能しません。

多くの相互参照と読書の後、「自分に合った」独自のソリューションを提供したいと思います。うまくいけば、それもあなたのために働く。最初から作成しませんでした。私は他のすべての貢献に触発されました(それらのほとんどは修正なしで「私のために」働きませんでしたが)。

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を使用します。

1
Garret Wilson