当目录和文件共享相同名称时清理 URL

Clean URLs when directories and files share the same name

我正在使用此代码段来启用干净的 URL,从而有效地删除 PHP 扩展名。

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

## hide .php extension snippet

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

# To internally forward /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ .php [L]

这很好用,但问题是我有一些目录与某些 PHP 文件同名。

所以我得到的不是所需的页面,而是目录结构。

我尝试在所有重写规则之前添加 DirectorySlash Off,但没有成功。

我读到,如果我正在使用 DirectorySlash Off,我必须删除 RewriteCond %{REQUEST_FILENAME} !-d,这也不起作用。

更不用说我在寻找解决方案时尝试了十几个不同的片段。

处理我的场景的正确方法是什么?

将您的 .htaccess 更改为:

Options +FollowSymLinks -MultiViews -Indexes
RewriteEngine On
RewriteBase /

## hide .php extension snippet

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

RewriteCond %{DOCUMENT_ROOT}/.php -f
RewriteRule ^(.+?)/?$ .php [L]
  • 出于安全原因,将 DirectorySlash 保持为默认值。
  • Options -Indexes用于禁用目录列表。