我有这样的网址:
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/name1
或http://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]
答案 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]