mod_rewrite:如何在文件夹上优先处理文件

时间:2015-01-27 13:39:58

标签: apache mod-rewrite

我有这样的网址:

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

我有一个看起来像这样的文件/文件夹结构

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文件。

对您提供的任何输入感到高兴。

欢呼声

*编辑*

到目前为止,我所拥有的内容看起来像这样

RewriteEngine on

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

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

1 个答案:

答案 0 :(得分:1)

你遇到的最大问题是mod_dir撤消你想做的事情。如果您的文件test.php和目录test/中包含index.php,则mod_rewrite会重写请求,然后mod_dir将完全忽略该请求并注入test/index.php作为网址并重新执行.htaccess文件。要使其正常工作,您必须禁用DirectoryIndex。如果存在具有相同名称的目录,为了防止Apache在url之后自动添加斜杠,也必须关闭DirectorySlash

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

DirectoryIndex disabled
DirectorySlash Off

RewriteEngine On
RewriteBase /

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