首页 > 解决方案 > .htaccess 使用现有目录重写规则

问题描述

.htaccess我的网站根目录上有以下文件

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?([^/]+)/?$ /index.php?t=$1 [L]

这意味着,对于某些链接,例如

www.website.com/foo
www.website.com/bar

它将在内部被替换为

www.website.com/index.php?t=foo
www.website.com/index.php?t=bar

问题是:这个目录之一(比如,bar)存在,我希望能够使用链接www.website.com/bar/file.pdf,所以我不得不修改.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/?([^/]+)/?$ /index.php?t=$1 [L]

我删除了以 结尾的行!-d,这意味着“如果目录不存在”。但现在我明白了

www.website.com/bar/index.php?t=bar

那我怎么能两者兼得

www.website.com/bar
www.website.com/bar/file.pdf

第一个重定向(内部)www.website.com/index.php?t=bar和第二个指向正确的文件?

标签: apache.htaccess

解决方案


如果 /bar/index.php 存在,你可以试试这个:

RewriteEngine On

#
# rule 1
#
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule . %{REQUEST_FILENAME}/index.php [QSA,L]

#
# rule 2
#
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?([^/]+)/?$ /index.php?t=$1 [L]

这样,如果目录 /bar/ 存在,它就会被第一条规则明确地重写为 /bar/index.php。同时,/bar/file.pdf 不会被触动,因为文件存在。


推荐阅读