重写规则以隐藏文件夹,如果没有尾部斜杠则无法正常工作

时间:2010-12-02 11:10:55

标签: .htaccess mod-rewrite apache2

我有一个奇怪的apache mod_rewrite问题。我需要隐藏用户的子目录,但是将每个请求重定向到该子目录。我在stackoverflow上发现了几个非常相似的问题,但没有什么真的适合,所以我决定发布一个新问题。

我的.htaccess看起来像这样:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)?$ foo/$1 [QSA,L]

document-root只包含以下文件夹/文件:

/foo/bar/index.html

我现在希望example.com/bar和example.com/bar/只显示index.html的内容。

而不是example.com/bar/按预期显示内容,但example.com/bar会将301重新定向到example to example.com/bar/foo/,然后显示内容。我真的不明白为什么在这种情况下有301重定向。

当我把这件事放进去时

  
RewriteCond %{REQUEST_URI} !^[^.]*/$
RewriteCond %{REQUEST_URI} !^[^.]*\.html$
RewriteCond %{REQUEST_URI} !^[^.]*\.php$
RewriteRule ^(.*)$ $1/ [QSA,L]

在该规则之上似乎有效,但这需要我列出每个使用过的文件扩展名......

有没有其他方法可以省略重定向,外部用户永远不会看到文件夹“bar”。

提前致谢!

2 个答案:

答案 0 :(得分:0)

第一个重写规则是从/ foo /(。)重定向到($ 1),第二个 - 从(。)重定向到$ 1.

只是想法,这还没有经过测试。

答案 1 :(得分:0)

迟到总比不上......

使用一个简单的RewriteRule,它会为每个没有的URL添加/。

# only directories
RewriteCond %{REQUEST_FILENAME} !-f
# exclude there directories
RewriteCond %{REQUEST_URI} !^/excluded-dirs
# exclude these extensions
RewriteCond %{REQUEST_URI} !\.excluded-extension$
# exclude request that already have a /
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ /$1/ [R=301,L]