.htaccessを使用して.php拡張子を削除する


101

はい、Apacheのマニュアルを読み、ここで検索しました。何らかの理由で、これを機能させることができません。私が来た最も近いものは、拡張子を削除することですが、ルートディレクトリをポイントしています。これは、.htaccessファイルが含まれているディレクトリでのみ機能します。

.htaccessファイルに対して3つのことを行う必要があります。

  1. .phpを削除するために必要です

    a。タブを使用するページがいくつかあり、URLはpage.php#tabのように見えます-これは可能ですか?

    b。正しい場所から来たことを確認するために、URLに追加されたセッションIDを使用する1つのページがありますwww.domain.com/download-software.php?abcdefg

これは可能ですか?また、これを行う場合、ヘッダーナビゲーションインクルードファイルのリンクから「.php」を削除する必要がありますか?すべきIE "<a href="support.php">support</a>" be <a href="support">support</a>?

  1. すべてのURLの前に「www」を強制したいので、そうではありませんdomain.comwww.domain.com/page
  2. ページからすべての末尾のスラッシュを削除したいと思います。

探し続けたり、試したりします。サブディレクトリにいると問題が発生しますか?



気になるのですが、これはどのようなメリットがありますか?これは、ユーザーがサーバー上のどのファイルにアクセスしているかわからないようにするためですか?
Kolobキャニオン2016

二つ折り。彼らは私たちが提供しているファイルの種類を知りません、そしてそれはよりきれいに見えますIMO
Dirty Bird Design

関連するもう1つの質問:stackoverflow.com/questions/6534904/…
Edward

回答:


121

スタックオーバーフローの質問でのGumboの回答Apache mod_rewriteで.html拡張子を非表示にする方法は正常に機能するはずです。

Re 1).htmlを.phpに変更します

Re a。)うん、それは可能#tabです。URLに追加するだけです。

Re b。)QSA(クエリ文字列の追加)を使用して可能です。以下を参照してください。

これサブディレクトリパスでも機能するはずです。

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

thxあなたのヘルプマンのために、何らかの理由で、セッションに追加されたURLがPHPファイルにハードコードされているために賭ける(長い話)上記なしでアクセスできます。私は本当にあなたの助けに感謝します、この.htaccessのものは私にとってトリッキーです。
Dirty Bird Design

8
@Pekka웃 [L,スペースQSA]フラグ間のスペースを削除します。削除しない場合、500内部サーバーエラーが発生します。
Rahil Wazir、2014

これは次と/index/bla/bla同じになりますindex.php
elkebirmed

何らかの理由で、これによりCSSのロードがブロックされます:/
TheCrazyProfessor

!意味しない。そのルールは、.phpで終わっていない場合にのみ.phpを追加するように書き換えることを示しています
user339568

72

Apache mod_rewrite

あなたが探しているのはmod_rewriteです

説明:要求されたURLをその場で書き換えるルールベースの書き換えエンジンを提供します。

一般的に言えば、 mod_rewrite要求されたドキュメントを指定された正規表現と照合すること機能し、内部(apacheプロセス内)または外部(クライアントブラウザ内)でURLの書き換えを実行します。これらの書き換えは、example.com / fooをexample.com/foo/barのリクエストに内部的に変換するのと同じくらい簡単です。

Apacheのドキュメントにはmod_rewriteガイドが含まれており、あなたがやりたいことがいくつかカバーされていると思います。詳細なmod_rewriteガイド

wwwサブドメインを強制する

すべてのURLの前に強制的に「www」を付けたいので、domain.comではなくwww.domain.com/page

書き換えガイドには、このための手順が含まれています Canonical Hostnameの例のます。

末尾のスラッシュを削除する(パート1)

ページからすべての末尾のスラッシュを削除したい

リライトガイドには正反対の例が含まれているため、なぜこれを行うのかわかりません。つまり、常に末尾にスラッシュを含めます。ドキュメントは、末尾のスラッシュを削除すると問題が発生する可能性が高いことを示唆しています:

末尾のスラッシュ問題

説明:

すべてのWebマスターは、ディレクトリを参照するURLの末尾のスラッシュの問題についての歌を歌うことができます。それらが欠落している場合、サーバーはエラーをダンプします。これは、/~quux/foo代わりに言うと/~quux/foo/ 、サーバーはfooという名前のファイルを検索するためです。そして、このファイルはディレクトリなので、文句を言います。実際にはほとんどの場合それ自体を修正しようとしますが、このメカニズムはあなたがエミュレートする必要がある場合があります。たとえば、CGIスクリプトなどに多くの複雑なURLの書き換えを行った後などです。

おそらく、常に末尾のスラッシュを常に削除したい理由を拡張できますか?

.php拡張機能を削除

.phpを削除するために必要です

私が考えることができるこれに最も近いことは、すべての要求ドキュメントを.php拡張子で内部的に書き換えることです。つまり、example.com / somepageは、代わりにexample.com/somepage.phpの要求として処理されます。この方法で進めるには、各somepageが実際にファイルシステム上のsomepage.phpとして存在する必要があることに注意してください。

正規表現の正しい組み合わせにより、これはある程度可能になるはずです。ただし、インデックスページが正しくリクエストされなかったり、ディレクトリが正しく一致しなかったりする可能性のある問題が発生する可能性があります。

たとえば、これはexample.com/testをexample.com/test.phpのリクエストとして正しく書き換えます。

RewriteEngine  on
RewriteRule ^(.*)$ $1.php

しかし、example.com / .phpがないため、example.comの読み込みに失敗します

末尾のスラッシュをすべて削除すると、親ディレクトリのファイル名の要求からディレクトリインデックスの要求を選択することがほぼ不可能になると思います。ディレクトリ「foobar」のリクエストをどのように決定しますか:

example.com/foobar

foob​​ar(実際にはfoobar.php)というファイルのリクエストから

example.com/foobar

RewriteBaseディレクティブを使用した場合、可能性があります。しかし、これを行うとRewriteCond、リクエストがディレクトリまたはファイルにマップされているかどうかをファイルシステムレベルでチェックするためのディレクティブが必要になるため、この問題はさらに複雑になります。

つまり、末尾のすべてのスラッシュを削除するという要件を削除して、代わりに末尾のスラッシュを強制追加すると、「。php拡張子がない」問題がもう少し合理的になります。

# Turn on the rewrite engine
RewriteEngine  on
# If the request doesn't end in .php (Case insensitive) continue processing rules
RewriteCond %{REQUEST_URI} !\.php$ [NC]
# If the request doesn't end in a slash continue processing the rules
RewriteCond %{REQUEST_URI} [^/]$
# Rewrite the request with a .php extension. L means this is the 'Last' rule
RewriteRule ^(.*)$ $1.php [L]

これはまだ完全ではありません。ファイルに対するすべてのリクエストは、内部的にリクエストに.phpが追加されたままです。「hi.txt」をリクエストすると、これがエラーログに記録されます。

[Tue Oct 26 18:12:52 2010] [error] [client 71.61.190.56] script '/var/www/test.peopleareducks.com/rewrite/hi.txt.php' not found or unable to stat

しかし、別のオプションがあります。次のようにDefaultTypeand DirectoryIndexディレクティブを設定します。

DefaultType application/x-httpd-php
DirectoryIndex index.php index.html

2013-11-14の更新-上記のスニペットを修正して、nicorelliusの観測を組み込みます

これでhi.txt(およびその他すべて)のリクエストが成功し、example.com / testへのリクエストはtest.phpの処理済みバージョンを返し、index.phpファイルは再び機能します。

Googleでphp no extension apacheを検索して、Michael J. Radwins Blogを見つけたので、このソリューションのクレジットが必要な場合は、クレジットを提供する必要があります。

末尾のスラッシュを削除する

検索をapache remove trailing slashes行った結果、検索エンジン最適化のページが表示されました。どうやら一部のコンテンツ管理システム(この場合はDrupal)は、URlsの末尾にスラッシュを付けても付けなくてもコンテンツを利用できるようにします。これにより、SEOの世界では、サイトに重複したコンテンツのペナルティが発生します。ソース

mod_rewrite要求されたリソースがa /で終わっているという条件で書き換えを行い、301 Permanent RedirectHTTPヘッダーを送り返すことでURL を書き換えることで、解決策はかなり簡単なようです。

これは、ドメインがblamcast.netであり、リクエストにオプションでプレフィックスを付けることができるようにする彼の例ですwww.

#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?blamcast\.net$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]

今、私たちはどこかに着いています。それをすべて組み合わせて、どのように見えるかを見てみましょう。

必須www.、なし.php、末尾のスラッシュなし

これは、ドメインがfoobar.comであり、標準ポート80で実行されていることを前提としています。

# Process all files as PHP by default
DefaultType application/x-httpd-php
# Fix sub-directory requests by allowing 'index' as a DirectoryIndex value
DirectoryIndex index index.html

# Force the domain to load with the www subdomain prefix
# If the request doesn't start with www...
RewriteCond %{HTTP_HOST}   !^www\.foobar\.com [NC]
# And the site name isn't empty
RewriteCond %{HTTP_HOST}   !^$
# Finally rewrite the request: end of rules, don't escape the output, and force a 301 redirect
RewriteRule ^/?(.*)         http://www.foobar.com/$1 [L,R,NE]

#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?foobar\.com$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]

「R」フラグについては、RewriteRuleディレクティブのセクションで説明しています。スニペット:

redirect|R [=code](強制リダイレクト)プレフィックス置換 http://thishost[:thisport]/(新しいURLをURIにする)を使用して、外部リダイレクトを強制します。コードが指定されていない場合、HTTP応答302(MOVED TEMPORARILY)が返されます。

最終メモ

スラッシュの除去を正常に機能させることができませんでした。リダイレクトによって、無限のリダイレクトループが発生しました。元のソリューションをよく読んだ後、Drupalインストールがどのように構成されているかが原因で、上記の例がうまく機能しているように感じます。彼は具体的に言及しています:

クリーンなURLが有効になっている通常のDrupalサイトでは、これら2つのアドレスは基本的に交換可能です

スラッシュがある場合とない場合で終わるURLへの参照。さらに、

Drupalは、呼び出さ.htaccessれたファイルを使用して、URLの処理方法をWebサーバーに指示します。これは、DrupalのクリーンURLマジックを有効にするファイルと同じです。単純なリダイレクトコマンドを.htaccessファイルの先頭に追加する ことで、サーバーに後続のスラッシュを自動的に削除させることができます。


すごい、ありがとうございます。実際、私はそれを機能させることができました。サーバー上に変更しなければならない奇妙なものがあったことがわかりました。とにかく、次の問題に移ります。1つを除くすべてのページから.phpを削除します。thx man
Dirty Bird Design、

よく考えられて整理された答えを見るのが好きです。よくできました...私が気づいたことの1つ:どういう意味DirectoryIndex index index.htmlですか?またはDirectoryIndex index.php index.html
nicorellius

@nicorelliusはあなたが正しいと信じています。私はあなたの観察で私の元の答えを更新しました。
Tim Bielawa 2013年

私はこれが常にうまくいくとは限らないと言う必要があります。以下の答えを試してください(ユーザー1079877)
DonJoe

あなたは本当のMVPです。
ZainZaheer06

45

上記の他の回答に加えて、

これを試して、ファイルから完全に.php拡張子を削除し、無限ループを回避することもできます

RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [NC,L]

このコードはRoot / .htaccessで機能します。これをサブディレクトリのhtaccessファイルに配置する場合は、必ずRewriteBaseを変更してください。

編集:

Apache 2.4以降では、ENDフラグを使用して無限ループエラーを防ぐこともできます。次の例は、Apache 2.4で上記と同じように機能します。

RewriteEngine on

RewriteRule ^(.+)\.php$ /$1 [R,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ /$1.php [NC,END]

10
こんにちは、ありがとうございます。私は.phpをカットするために多くの解決策を試しましたが、これだけが正しく機能しました:)
Beamkiller

4
ありがとう!この編集は、at、apache 2.4、apache 2.5が無限ループになる(そして500になる)[END]超重要
Jake Bolam

23

次のコードは私にとってはうまくいきます:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php

これは、example.comがすべてのファイルとディレクトリのインデックスになることを除いて機能します。(Apache 2.4)
earth2jason 2014


10

パラメータを変更した後AllowOverrideからNoneAll/etc/apache2/apache2.conf(Debianの8)、以下の、.htaccessファイルだけ含まれている必要があります:

Options +MultiViews
AddHandler php5-script php
AddType text/html php

そして、ファイルから.php拡張子を隠すのに十分でした


これがもっと高かったらいいのに。MultiViewsこれがすぐに
Phil

これは素晴らしい。欠点はありますか?
改訂

@改革ありがとうございます。ソースコードの<a href="somepage.php">リンク</a><a href="somepage">リンク</a>に変更する必要がありました
Rodney Salcedo

8

これを試して
次のコードは間違いなく動作します

RewriteEngine on
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]

5

なぜ他の答えがうまくいかなかったのかわかりませんが、私が見つけたこのコードはうまくいきました:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

それが私のhtaccessにあるすべてであり、example.com / pageはexample.com/page.phpを示しています


4

たとえば、yoursite.com / about.phpからyoursite.com/aboutへのPHPファイルから.php拡張子を削除するには次の手順に従います。Webサイトのルートから.htaccess(存在しない場合は新しいファイルを作成)ファイルを開き、次のコードを追加します。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

たとえば、yoursite.com / about.htmlからyoursite.com/aboutへのhtmlファイルから.html拡張子を削除するには次の手順に従います。

Webサイトのルートから.htaccess(存在しない場合は新しいファイルを作成)ファイルを開き、次のコードを追加します。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]

リファレンス:URLからphpの拡張子を削除する方法


1
私が必要とした唯一の答え。ありがとう!:)
MatrixCow08

2

PHPでコーディングしていて、.phpを削除したい場合は、次のようなURLを使用できます。

http://yourdomain.com/blah- > /blah.phpを指します

これで十分です。

<IfModule mod_rewrite.c>
    RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

2

私は100%機能するコンセプトを見つけました:

# Options is required by Many Hosting
Options +MultiViews

RewriteEngine on

# For .php & .html URL's:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule ^([^\.]+)$ $1.html [NC,L]

次のように、Webサイトの.htaccessファイルのルートでこのコードを使用します。

オフライン-wamp \ www \ YourWebDir

オンライン-public_html /

正しく機能しない場合は、Wampサーバーの設定を変更します。1)WAMPアイコンを左クリックします。2)Apache 3)Apacheモジュール4)rewrite_moduleを左クリックします。


RewriteRuleタグをL隣り合わせにして2つのを使用することはできません。[L]伝えmod_rewrite、それが指定されたため、最後のルールだとRewriteCond
MD XF

2

.phpファイル名から拡張子を隠すために使用したコードは次のとおりです。

## hide .php extension
# To redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,L,NC]

注:R=301は永続的なリダイレクト用であり、SEOの目的で使用することをお勧めします。ただし、一時的なリダイレクトだけが必要な場合は、R


2

私は次の作業コードで終わりました:

RewriteEngine on 
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]

1

PHPのURLがhttp://yourdomain.com/demo.phpのように、http://yourdomain.com/demoのように来る場合

これで十分です。

.htaccessファイルを作成する

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
#RewriteRule ^([^\.]+)$ $1.html [NC,L]
RewriteRule ^([^\.]+)$ $1.php [NC,L]

機能しましたhttp://example.com/myfile が機能しませんでしたhttp://example.com/myfolder/(インデックスファイル)。インデックスファイルで機能させるのを手伝ってくれませんか?
WesleyGonçalves19年

@starkeenの回答URLより上で試してみるべきだと思います:stackoverflow.com/a/30566026/3786343
Kamlesh

1

試す

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.*)$ $1.php [L] 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.