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]
我将所有网站页面都放在这样的子目录中...
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]