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

时间:2018-03-30 18:40:09

标签: php apache .htaccess mod-rewrite clean-urls

我正在使用此代码段来启用干净的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 ^(.*?)/?$ $1.php [L]

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

因此,我获得了目录结构,而不是所需的页面。

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

我已经读过,如果我使用RewriteCond %{REQUEST_FILENAME} !-d,我必须删除DirectorySlash Off,但这也不起作用。

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

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

1 个答案:

答案 0 :(得分:1)

将.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}/$1.php -f
RewriteRule ^(.+?)/?$ $1.php [L]
  • 出于安全原因,请将DirectorySlash设置为默认值。
  • Options -Indexes用于禁用目录列表。