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
foobar(実際には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
しかし、別のオプションがあります。次のようにDefaultType
and 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 Redirect
HTTPヘッダーを送り返すことで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
ファイルの先頭に追加する
ことで、サーバーに後続のスラッシュを自動的に削除させることができます。