Mod 重写以在不破坏 DirectoryIndex 的情况下删除子目录和文件扩展名

Mod rewrite to remove subdirectory and file extension without breaking DirectoryIndex

我将所有网站页面都放在这样的子目录中...

http://www.example.com/pages/myfile.php

我希望 URL 看起来像这样...

http://www.example.com/myfile

其中 名为 pages 的子目录和 .php 文件扩展名已从 URL.

中删除

我最近的(部分)尝试...

Options All -Indexes +FollowSymLinks

DirectoryIndex index.php

RewriteEngine On
RewriteBase /
RewriteCond %{DOCUMENT_ROOT}/pages%{REQUEST_URI}\.php -f [OR]
RewriteCond %{DOCUMENT_ROOT}/pages%{REQUEST_URI} -d
RewriteRule ^(.*)$ /pages/.php [NC,L]

然而,这完全打破了DirectoryIndex。当我转到 http://www.example.com/http://www.example.com/foo/ 时,我收到 404 错误,而不是默认为 DirectoryIndex 定义的 index.php

显然,它将所有内容都视为文件名,而不是识别缺少文件名(目录)并尝试使用 index.php

我尝试将 this solution 合并到我的中,它解决了 DirectoryIndex 问题,但它破坏了其他一切。

有解决办法吗?请在您的回答中包含详细的解释,以便我了解 where/how 我错了。

在 root .htaccess 中试试这个:

Options All -Indexes +FollowSymLinks
DirectoryIndex index.php

RewriteEngine On
RewriteBase /

# add a trailing slash if pages/<uri> is a directory
RewriteCond %{DOCUMENT_ROOT}/pages/ -d
RewriteRule ^(.*?[^/])$ %{REQUEST_URI}/ [L,R=302]

RewriteRule ^/?$ pages/index.php [L]

# skip all files and directories from rewrite rules below
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

# if corresponding .php file exists in pages/ directory
RewriteCond %{DOCUMENT_ROOT}/pages/\.php -f
RewriteRule ^(.+?)/?$ pages/.php [L]

# route all requests to pages/
RewriteRule ^((?!pages/).*)$ pages/ [L,NC]