Php .htaccess:多个.htaccess文件如何工作?

Php .htaccess:多个.htaccess文件如何工作?,php,.htaccess,cakephp,redirect,Php,.htaccess,Cakephp,Redirect,这是在CakePHP的上下文中,但我确信它在其他应用程序中很常见。我执行了本页上的说明: A: 重新启动发动机 重写规则^$app/webroot/[L] 重写规则(*)app/webroot/$1[L] B: 重新启动发动机 重写规则^$webroot/[L] 重写规则(.*)webroot/$1[L] C: 重新启动发动机 重写cond%{REQUEST_FILENAME}-D 重写cond%{REQUEST_FILENAME}-F 重写规则^(.*)$index.php?url

这是在CakePHP的上下文中,但我确信它在其他应用程序中很常见。我执行了本页上的说明:

A:


重新启动发动机
重写规则^$app/webroot/[L]
重写规则(*)app/webroot/$1[L]
B:


重新启动发动机
重写规则^$webroot/[L]
重写规则(.*)webroot/$1[L]
C:


重新启动发动机
重写cond%{REQUEST_FILENAME}-D
重写cond%{REQUEST_FILENAME}-F
重写规则^(.*)$index.php?url=$1[QSA,L]
在第3节中,有3个.htaccess文件。为了简单起见,我们把它们称为A、B和C。虽然它似乎在我的服务器(localhost XAMPP)上工作,但我不确定是否理解重定向的路径。无论我键入什么地址,它都会按预期转到localhost\cake\users\login

我的应用程序的根目录(就其所在位置而言)是\cake。我有分别带有A、B和C的\cake、\cake\app和cake\app\webroot。按照上述说明操作后,cake\app中的代码将运行,这正是我想要的。在像上面那样正确设置.htaccess文件之前,正在运行\cake中的代码;这是不正确的,因为它告诉我我的数据库没有设置,你没有这个文件,等等

在运行任何php文件之前,是否有人可以插话帮助我了解这个应用程序的“路径”?是否将所有内容重定向到cake\app\webroot,然后再重定向到.htaccess文件之外的任何重定向?(在本例中,为cake\users\login)

谢谢你的帮助


PS:我很惭愧地说,我还没有弄清楚哪个文件的哪个部分正在重定向到用户登录页面的所有HTTP请求。我不久前设置了这个,我刚刚回到它。我想我是在遵循CakePHP Cookbook页面上的第二个教程,其中添加了ACL功能。

下面的一行将所有内容重定向到索引页面,这是一个蛋糕结构

RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
在您的情况下,我不认为您的重定向是由.htaccess文件直接导致的。您的webroot htaccess只是将所有内容通过管道传输到您的索引页

不过,你应该考虑查看索引页面。该页的控制器可能有一个用于传入参数的默认子句。因此,如果您输入一个带有未知参数的url,您的索引页面将只显示一个登录屏幕

那是我的两分钱。然而,我只是作为实验使用CakePHP,所以如果我错了,有经验的人可以随意纠正我

在运行任何php文件之前,是否有人可以插话帮助我了解这个应用程序的“路径”?是否将所有内容重定向到cake\app\webroot,然后再重定向到.htaccess文件之外的任何重定向?(在本例中,为cake\users\login)

简而言之,是的。只有一个
.htaccess
文件执行实际工作,那就是“C”(即
/app/webroot/.htaccess
中的文件)。这会将不针对现有文件或目录的任何请求传递到
index.php
,后者引导CakePHP并处理该请求。任何进一步的“重定向”都由处理

编辑: 要解决您关于什么重定向到登录页面的问题,您可能已经配置了,并且没有通过设置任何“公共”页面


如果您将CakePHP安装目录或应用程序目录放入Apache用于提供页面服务的文件夹中,则可以使用其他两个目录,例如
/var/www/html
或类似文件夹。您会注意到结构是:

/cakephp-1.3.x/.htaccess(“A”)

/cakephp-1.3.x/app/.htaccess(“B”)

/cakephp-1.3.x/app/webroot/.htaccess(“C”)


因此,这些级别上的任何请求最终都将由“C”中的重写规则处理。这样做是为了保护敏感数据,如数据库连接信息,并确保应用程序正常运行(因为所有请求都应该通过CakePHP引导程序,除非您设置了自定义路由).

我认为这是因为在应用程序中使用了Auth组件。您写道,您正在尝试cakephp的Acl组件部分,这是使用Auth组件的地方。如果请求的控制器中包含Auth组件,则默认情况下,如果未指定其他loin方法,cakephp将重定向到/users/login。因此,我猜htaccess不会在这里造成问题。

简单的跟踪方法:为每次重写的url添加一个额外的查询参数:
RewriteRule…?url=$1&from=fileC
Marc,“…”应该是其他内容吗?是的,这是重写url的其余部分。只是懒散,不把所有的东西都剪下来粘贴。重要的一点是添加
&from=fileC
查询参数。实际上,我想我知道你的意思。我尝试将这些参数添加到每个重写规则中。。但是,我并没有在页面加载上看到任何显示。您正在重写中执行重定向,所以它只是一个内部重写。。。它们应该显示在服务器的访问日志中。感谢您的输入317。当我没有像上面那样的htaccess设置时,我转到localhost/cake,它从没有配置文件设置的\cake目录中读取文件。e、 g.当正确的一个在cake\app\database.php中时,它看起来像是cake\database.php。我看到cake\app\webroot\index.php是每个请求在当前A、B和C设置下重定向到的文件。嗯,我将进一步研究这个index.php文件。我不认为我已经修改了它(使用它是从下载)。非常感谢你贾斯汀!你是对的。我在cake\app\app\u controller.php中找到了Auth组件,BeforeFilter正在使用登录页面。我感谢你的清楚解释。这听起来很有道理。
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule ^$ webroot/ [L]
    RewriteRule (.*) webroot/$1 [L]
</IfModule>
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]