ドメイン全体で、URLにファイル拡張子を非表示にするおよび末尾のスラッシュを削除する、ドメイン名自体とは無関係です(たとえば、どのドメインでも動作します)。
ホームページ以外のindex。*ファイルは使用していません。
これらのファイルがどのように要求され、ブラウザでどのように表示されるかについてのいくつかの例:
/
およびindex.php
-> mydomain.com
(文字通り、単なるドメイン名)。
/account.php
または/account/
または/account
-> mydomain.com/account
/account/subscriptions.php
または/account/subscriptions/
または/account/subscriptions
-> mydomain.com/account/subscriptions
ご覧のとおり、各Webページにアクセスするにはいくつかの方法がありますが、2つまたは3つの方法のいずれを使用しても、ブラウザに優先URLが1つだけ表示されます。
mod_rewriteを使用して.htaccessでこれを行う方法
私はこれを理解しようとして壁に頭を打ちましたが、一般的に、書き換えフローは次のように思われます:
mydomain.com/account/
-> mydomain.com/account
)mydomain.com/account
-> mydomain.com/account.php
)私は一日中グーグルで調べ、数千行のドキュメントと設定テキストを読んで、数十回試してみました...これに関するより多くの頭脳が大いに役立つと思います。
質問に対する回答が見つかりました(下記を参照)。
質問をご覧いただきありがとうございますが、私たちはそれを理解したようです。
Options -Multiviews -Indexes +FollowSymLinks
RewriteEngine On
RewriteBase /
DirectorySlash Off
# remove trailing slash
RewriteRule ^(.*)\/(\?.*)?$ $1$2 [R=301,L]
# rewrite /dir/file?query to /dir/file.php?query
RewriteRule ^([\w\/-]+)(\?.*)?$ $1.php$2 [L,T=application/x-httpd-php]
エンジンが混乱しないようにマルチビューとインデックスをオフにする必要があります。代わりに、index.*
ファイルを参照するか、ディレクトリリストが表示されるようにします。 。
最初のリダイレクト(R=301
)は末尾のスラッシュを削除し、2番目のリダイレクトはそれを手元のPHP(またはHTMLなど)ファイルに内部的に書き換えます。
この.htaccessファイルはクエリ文字列もサポートしています。
更新以前のコメントで述べたように、nginxに切り替えました。これは、(devボックスからの)URL書き換えに関連するすべてのconfファイルに含まれています。
location = / {
index index.html;
}
try_files $uri $uri.html =404;
また、PHPから単なるHTMLに切り替えましたが、上記の拡張機能を変更してもほとんど違いはありません。
なぜ/ accountを/account.phpにリダイレクトするのですか?実際、ページ/ accountは コンテンツネゴシエーション でのみ存在します。必要ない場合は、ディレクティブを無効にしてください。
あなたの2つのルールについて、私はそれが簡単だと思います:
RewriteRule ^/account/$ /account
RewriteRule ^/account$ /account.php [R,L]
ただし、テストされていません。 [R,L]
を最初の行に追加することもできます。この場合、ブラウザーはもう1つリダイレクトを行います。
ウェブサイトやアプリのURLリクエストをルーティングするための柔軟でシンプルな方法が必要な場合は、PHPマイクロフレームワークをお勧めします。 URLルーティングを完全に制御できるだけでなく、他の利点も提供します。
Symfony Templating Component と組み合わせた Slim Framework を以前に使用したことがあります。もう一度やるなら、おそらく Silex Micro-framework を使用するでしょう。これはSymfonyコンポーネントの一部でもあるからです。