mod_rewrite公共文件夹中的所有非文件查询到../index.php

时间:2015-08-19 23:18:40

标签: php apache .htaccess mod-rewrite slim

我有以下文件夹逻辑:

.htaccess
index.php
composer.json
(etc. with all processing files)
public/
    .htaccess
    design/
    files/
    (etc. with all static files)

在.htaccess中都有以下内容:

(.htaccess:)
RewriteEngine on
RewriteRule   ^(.*)$ public/$1    [L]
(public/.htaccess)
RewriteEngine on
RewriteCond $1 !^(index\.php|robots\.txt|favicon\.ico)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

第一个.htaccess在开发MAMP时非常有用,并且在生产中未被请求,因为大多数网站都直接提供公共文件夹。

此请求的原因与public/index.php文件的include '../index.php';相反,例如,Slim使用$_SERVER['PHP_SELF'],这会通过强制/公共进入网址来中断路由。 One dirty way to solve this涉及更改vendor / slim / slim文件夹中的文件,这应该是一个相对较大的遗忘。

1 个答案:

答案 0 :(得分:0)

(在写我的问题时,我最终发现了一个我想分享的舒适解决方案)

(.htaccess)
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !index.php
RewriteRule   ^(.*)$ public/$1    [L]
(public/.htaccess)
RewriteEngine on
RewriteCond $1 !^(index\.php|robots\.txt|favicon\.ico)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ ../index.php/$1 [L,QSA]

正在开发中,

  • 第一个.htaccess将所有调用重定向,但index.php重定向到public /
  • 第二个.htaccess将所有非文件重定向到公共外部的../ index.php,
  • 第一个.htaccess什么也没做。

在制作时,只完成第二步和第三步。

这样,动态文件与静态文件严格分开。