.htaccess规则 - 检查请求是针对文件夹还是文件?

时间:2013-06-20 21:01:43

标签: apache .htaccess mod-rewrite

我需要检查请求的网址,并根据请求是针对文件还是目录提供不同的选项。

我的网址如下:

  • http://www.example.com/Services/Service-1(目录,服务/pages/Services/Service1/index.php
  • http://www.example.com/Services/Service-1/Feature-1/Sub-Feature(实际文件,提供/pages/Services/Service-1/Feature-1/Sub-Feature.php

由于我对.htaccess缺乏了解(这需要一个RewriteCondition吗?),我目前无法枚举我的目录结构的每个文件夹,如下所示:

RewriteRule ^Services/Service-1/(.*)$ /pages/Services/Service-1/$1.php
RewriteRule ^Services/Service-1 /pages/Services/Service-1/index.php

RewriteRule ^Services/Service-2/(.*)$ /pages/Services/Service-2/$1.php
RewriteRule ^Services/Service-2 /pages/Services/Service-2/index.php

RewriteRule ^Services/(.*)$ /pages/Services/$1.php
RewriteRule ^Services /pages/Services/index.php

RewriteRule ^Testimonials/(.*)$ /pages/Testimonials/$1.php
RewriteRule ^Testimonials /pages/Testimonials/index.php

毋庸置疑,这是一个真正的痛苦 - 任何时候我添加内容文件夹,我都要乱用.htaccess。

我知道必须有一个更好的方法,但是当我尝试时,我的google和stackoverflow搜索没有出现任何有效的内容。

2 个答案:

答案 0 :(得分:3)

你猜对了,一个rewriteCond可以用来验证请求的uri是文件还是目录:

# f for a file, d for a directory
RewriteCond %{REQUEST_FILENAME} -f 

你.htaccess将是:

Options -MultiViews
RewriteEngine ON    

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule (.+) /$1/index.php [QSA,L]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule (.+) /$1.php [QSA,L]

修改: 如果您的文件驻留在页面子目录中,则必须使用以下代码:

Options -MultiViews
RewriteEngine ON    

RewriteCond %{DOCUMENT_ROOT}/pages/$1 -d
RewriteRule (.+) /pages/$1/index.php [QSA,L]

RewriteCond %{DOCUMENT_ROOT}/pages/$1.php -f
RewriteRule (.+) /pages/$1.php [QSA,L]

答案 1 :(得分:0)

到目前为止,最简单的如果启用mod协商(通常是):

Options MultiViews
MultiviewsMatch Any
DirectoryIndex index.php

不会强制.php,如果你有somefile.html和somefile.php,通常会选择.html文件。