URLから.phpだけを削除するには、現在次の方法があります。
# Remove trailing slashes
RewriteRule ^(.*)\/$ $1 [NC,L,R=301]
# Remove trailing .php extensions
RewriteCond %{THE_REQUEST} (\S*?)/(.*?)\.php [NC]
RewriteRule ^ %1/%2 [L,R=301]
# Add .php extension for final internal redirect
RewriteCond %{REQUEST_URI} ^(.*)$
RewriteRule !\.php$ %1.php [NC,L]
しかし、これらのルールは bare には適用されexample.com
ず、 となってしまいますexample.com/.php
。どうすればこれを修正できるでしょうか?
答え1
次のいずれかを行う必要があります。
- 宛先ファイル(拡張子付き
.php
)が存在するか確認する前に内部的に書き換える - ディレクトリ(ドキュメント ルートが 1 つあるディレクトリ)の書き換えは避けてください。
- ドキュメント ルートのみを書き換えることは避けてください (例のように)。
たとえば、特定の例のように、ドキュメント ルートのみを書き換えないようにするには、既存のRewriteCond
ディレクティブを変更します。
# Add .php extension for final internal redirect RewriteCond %{REQUEST_URI} ^(.*)$
読む:
RewriteCond %{REQUEST_URI} ^(/.+)$
/.+
スラッシュに続いて何かドキュメント ルートは当然スラッシュそのものなので、ドキュメント ルートは除外されます。
すべてのディレクトリ (ドキュメント ルートを含む) の書き換えを回避するには、物理ディレクトリにマップされる URL の書き換えを回避するための追加条件を追加できます。例:
RewriteCond %{REQUEST_URI} ^(/.+)$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.php$ %1.php [NC,L]
ただし、アクセス可能なディレクトリがある場合は、末尾のスラッシュを削除する既存のルールを変更する必要があります。そうしないと、ディレクトリを要求したときにリダイレクト ループが発生する可能性があります (mod_dir はデフォルトでスラッシュを追加するため)。例:
# Remove trailing slashes RewriteRule ^(.*)\/$ $1 [NC,L,R=301]
上記と同じ条件を含むように変更する必要があります。
# Remove trailing slashes, unless the request maps to a directory
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1 [L,R=301]
また、NC
ここではフラグは必要ありません。また、スラッシュをエスケープする必要もありません。RewriteRule
パターン。
RewriteBase
ファイル内の他の場所にもディレクティブを定義する必要があると思います。そうしないと、 で無効なリダイレクトが発生する可能性があります.htaccess
。