web-dev-qa-db-ja.com

書き換えURL-末尾の/を削除し、.phpを追加します

簡単な質問がありますが、質問に答える投稿は見つかりませんでした。末尾の/があればそれを削除し、それがどのフォルダーにあるかに関係なく.phpを追加するように、URLを書き換えるhtaccessファイルが必要です。基本的に、これは私がやりたいことです:

http://example.com/login/ -> http://example.com/login.php
http://example.com/login -> http://example.com/login.php
http://example.com/user/test/login/ -> http://example.com/user/test/login.php
http://example.com/user/test/login -> http://example.com/user/test/login.php
http://example.com/$1/$2/$3/$4/ -> http://example.com/$1/$2/$3/$4.php
http://example.com/$1/$2/$3/$4 -> http://example.com/$1/$2/$3/$4.php
http://example.com/$1/$2/$3/ ... /$65/ -> http://example.com/$1/$2/$3/ ... /$65.php

URLを書き換えて末尾のスラッシュがあれば削除し、.phpを追加します(ただし、これはファイルが存在する場合にのみ行います)。また、「ワイルドカード」サポートが必要です。つまり、個々のファイルごとにコードをコピーすることなく、すべてのファイルで機能します。そうすれば、URLは「きれいに見える」。

サンプル.htaccessファイルを含む多くの投稿を見つけました。しかし、私はこれらの問題の1つなしで1つを見つけませんでした:

  1. 「ワイルドカード」書き換えは使用しないため、各ファイルのコードをコピーしてURLを書き換える必要があります。

  2. 末尾のスラッシュがあれば削除し、ファイルに書き換える代わりに、/index.php?file=にファイル名を追加します。

  3. 「ワイルドカード」書き換えは、ルートディレクトリでのみ機能します。ファイルが次のようにネストされている場合は使用できません:/$1/$2/$3/$4/

これは可能ですか?誰もそれをするのを見たことがありません。

編集:誰かがこのすべてを正しく実行するがURLパラメーターもサポートする.htaccessファイルを見つけた場合、私は賞金を授与します。

5
Aaron Esau

URLを正規化し、.phpを追加するために、external redirectで末尾のスラッシュ(ある場合)を削除することを想定していますURLを正しくルーティングするために、internal rewrite(つまり、ユーザーから隠されている)の拡張子。これは2段階のプロセスです。

注意:物理ディレクトリにアクセスする場合は、末尾のスラッシュを残す必要があります。

.htaccessでmod_rewriteを使用する:

RewriteEngine On

# Remove the trailing slash (if any) for non-directories
# This is essentially unconditional in order to canonicalise the URL
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*)/$ /$1 [R=302,L]

# Append ".php" if that file would exist (internal rewrite / hidden from user)
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule (.*) $1.php [L]

R=302(つまり、一時的なリダイレクト)をR=301に変更して永続化します。 302はブラウザによってキャッシュされないため、テストが簡単です。 (テストする前に、ブラウザのキャッシュがクリアされていることを確認してください。)

任意のファイル深度で機能するという意味で、「ワイルドカード」です。 .*は単にすべてを取得します。

URLパラメータはデフォルトで置換に追加されます-この点で特別なことは必要ありません。


PDATE:正規のURLはURLwithのように見えるため、末尾のスラッシュ(リクエストがPOSTされる先) )次に、上記を次のように変更する必要があります。

RewriteEngine On

# Append .php if that file exists (internal rewrite)
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule (.*?)/?$ $1.php [L]

これは、/path/to/file/path/to/file/の両方のリクエストを受け入れ、リクエストを/path/to/file.phpに内部的に書き換えます。スクリプトでURLの正規化を処理する必要があります。すべてのURLが既に/path/to/file/を指している場合(つまり、with末尾のスラッシュ)、RewriteRulepattern?の両方を削除します。 (.*)/$-これにより、要求で末尾のスラッシュが必須になります。

3
MrWhite