mod_rewrite:如何使文件优先于文件夹

mod_rewrite: how to prioritize files over folders

我有 URL 个这样的:

http://www.example.com/name1
http://www.example.com/name1/
http://www.example.com/name1/test1

我有一个 file/folder 结构,看起来像这样

src
|
----name1.html
|
----name1
    |
    ----test2.html

1) 如果用户访问,例如http://www.example.com/name1http://www.example.com/name1/(带尾部斜杠)我想提供 html 文件。

2) 如果用户访问例如http://www.example.com/name1/test1 我想提供文件夹 test1.

中的 html 文件

我可以在 SO 上找到的不同解决方案总是使用

RewriteCond %{REQUEST_FILENAME} !-d

以确保它不是一个目录 - 但我也想重写 URL 如果它是一个现有的目录,只要有一个 html-file 具有相同的名字.

很高兴您能提供任何意见。

干杯

* 编辑 *

目前我所拥有的看起来像这样

RewriteEngine on

RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.+[^/])/$ http://%{HTTP_HOST}/

RewriteRule !.*\.html$ %{REQUEST_FILENAME}.html [L]

您遇到的最大问题是 mod_dir 撤消了您尝试执行的任何操作。如果你有一个文件 test.php 和一个目录 test/ 其中包含 index.phpmod_rewrite 将重写请求,然后 mod_dir 将完全忽略并注入test/index.php 作为 url 并重新执行 .htaccess 文件。要使其正常工作,您必须禁用 DirectoryIndex。如果存在同名目录,要防止 Apache 在 url 后自动添加斜线,还必须关闭 DirectorySlash

之后就很简单了。你匹配任何没有点的东西(这样我们就不会做不必要的文件检查)并在捕获组之外留下一个尾部斜杠(如果存在的话)。然后使用此捕获组 (%1) 创建一个文件名以查看它是否存在。如果是,则重写请求。

DirectoryIndex disabled
DirectorySlash Off

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} ^([^.]*?)/?$
RewriteCond %1.html -f
RewriteRule ^([^.]*?)/?$ .html [L]