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/name1
或 http://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.php
,mod_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]
我有 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/name1
或 http://www.example.com/name1/
(带尾部斜杠)我想提供 html 文件。
2) 如果用户访问例如http://www.example.com/name1/test1
我想提供文件夹 test1
.
我可以在 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.php
,mod_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]