在.htaccess中路由到/ public和index.php

时间:2013-05-26 15:09:44

标签: php apache .htaccess mod-rewrite

我有一个基于Slim框架的PHP应用程序,在/public目录和.htacces文件后面有静态文件:

# URL routing
Options -MultiViews
RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}/public%{REQUEST_URI} -f
RewriteRule ^ %{DOCUMENT_ROOT}/public%{REQUEST_URI} [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]

当我尝试访问/index.php时,Apache直接返回它,但是我希望它被传递给index.php(它将返回404找不到)。我该怎么办?

如果我尝试删除RewriteCond %{REQUEST_FILENAME} !-f

# URL routing
Options -MultiViews
RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}/public%{REQUEST_URI} -f
RewriteRule ^ %{DOCUMENT_ROOT}/public%{REQUEST_URI} [L]

RewriteRule ^ index.php [QSA,L]

Apache返回“内部服务器错误”。我怎么能完成它?

Upd:我的项目结构

www/
├── app/
├── cache/
├── public/
│   ├── css/
│   ├── img/
│   └── js/
├── vendor/
├── views/
└── index.php

2 个答案:

答案 0 :(得分:1)

你的RewriteRules是一团糟。

RewriteCond %{DOCUMENT_ROOT}/public%{REQUEST_URI} -f
RewriteRule ^ %{DOCUMENT_ROOT}/public%{REQUEST_URI} [L]

你告诉Apache有什么"如果DOCUMENT_ROOT / public%{REQUEST_URI}是一个文件"。但是,在您的设置中,DOCUMENT_ROOT已经是公共/。这是你混乱的根源。

请考虑一下:

 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteRule ^(.+)$ /public/$1 [L]

 RewriteRule ^$ ./index.php [QSA,L]

Apache已经为你做了文件名翻译,你正在尝试使用DOCUMENT_ROOT进行文件翻译

答案 1 :(得分:-1)

最好的办法是删除.HTACCESS文件或使用

在您的服务器ROOT中编辑它

DirectoryIndex public_html www html