web-dev-qa-db-ja.com

.htaccessを使用して.htmlおよび.php拡張子を削除します

新しいディレクトリを作成してファイルにindex.phpという名前を付けずに、Webページからファイルタイプを削除するにはどうすればよいですか。 http://example.com/google.html から http://example.com/google が欲しいです。

どうすればこれを行うことができますか。

PS:他のチュートリアルをいくつか見てみましたが、混乱しました。 .htaccessで実行できるようになりました

9
SimplePi

はい、私はこの質問がすでに何度も尋ねられて答えられていることを知っています、しかし私は私の経験に基づいてもう少し包括的な答えを与えます。

これがあなたを助ける.htaccessコードスニペットです:

# Apache Rewrite Rules
 <IfModule mod_rewrite.c>
  Options +FollowSymLinks
  RewriteEngine On
  RewriteBase /

# Add trailing slash to url
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/|#(.*))$
  RewriteRule ^(.*)$ $1/ [R=301,L]

# Remove .php-extension from url
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME}\.php -f
  RewriteRule ^([^\.]+)/$ $1.php 

# End of Apache Rewrite Rules
 </IfModule>

皆さんの参考のために、ここでいくつかの重要なことを強調したいと思います。

  • このコードスニペットはURLからエントリスクリプトを削除しません(多くのPHPフレームワーク)で使用されるindex.phpなど)
  • .php拡張子のみを削除します。他の拡張子(例:.html)も削除する場合は、3番目のブロックをコピーして貼り付け、phpを他の拡張子に置き換えます。
  • アンカー(リンク)hrefから拡張機能も削除することを忘れないでください。
17
Arman P.

上記の@armanPの承認された回答は、phpURLからのremove.php拡張子ではありません。最後に.phpを使用せずにphpファイルにアクセスできるようにするだけです。たとえば、/file.phpには/fileまたは/file.phpを使用してアクセスできますが、この方法では、同じ場所を指す2つの異なるURLがあります。

.phpを完全に削除する場合は、/.htaccessで次のルールを使用できます。

RewriteEngine on 
#redirect /file.php to /file
RewriteCond %{THE_REQUEST} \s/([^.]+)\.php [NC]
RewriteRule ^ /%1 [NE,L,R]
# now we will internally map /file to /file.php
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)/?$ /$1.php  [L]

。htmlを削除するには、これを使用します

 RewriteEngine on
 #redirect /file.html to /file
 RewriteCond %{THE_REQUEST} \s/([^.]+)\.html [NC]
 RewriteRule ^ /%1 [NE,L,R]
 # now we will internally map /file to/ file.html
 RewriteCond %{REQUEST_FILENAME}.html -f
 RewriteRule ^(.*)/?$ /$1.html  [L]

Apache 2.4 *ユーザー向けのソリューション:

Apacheのバージョンが2.4の場合、RewriteConditionsなしでコードを使用できます。Apache2.4では、ENDの代わりにRewriteCondフラグを使用して、無限ループエラーを防ぐことができます。

これがApache2.4ユーザー向けのソリューションです

 RewriteEngine on

 #redirect  /file.php to /file
  RewriteRule ^(.+).php$ /$1 [L,R]
 # now we will internally map /file to /file.php
 RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)/?$ /$1.php [END]

注:これらのルールを追加した後、外部スタイルシートまたは画像が読み込まれない場合、これを修正するには、リンクを絶対的に<img src="foo.png>から<img src="/foo.png>に変更します。ファイル名の前の/に注意してください。 。または、URIベースを変更して、Webページのヘッドセクションに以下を追加します<base href="/">

次の理由により、Webページがcssとjsを読み込めません。

ブラウザのURLが/file.phpから/fileに変わると、サーバーは/fileがディレクトリであると見なし、すべての相対パスの前にそれを追加しようとします。例:URLがhttp://example.com/file/の場合、相対パスが<img src "/file/foo.png">に変更されるため、画像の読み込みに失敗します。この問題を解決するには、前回のペラグラフで説明したソリューションの1つを使用できます。

3
starkeen