【问题标题】:.htaccess: how do multiple .htaccess files work?.htaccess:多个 .htaccess 文件如何工作?
【发布时间】:2011-12-15 03:05:05
【问题描述】:

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

http://book.cakephp.org/view/917/Apache-and-mod_rewrite-and-htaccess

答:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule ^$ app/webroot/ [L]
    RewriteRule (.*) app/webroot/$1 [L]
</IfModule>

乙:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule ^$ webroot/ [L]
    RewriteRule (.*) webroot/$1 [L]
</IfModule>

C:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

在第 3 节中,有 3 个 .htaccess 文件。为简单起见,我们将它们称为 A、B 和 C。虽然它似乎在我的服务器(localhost XAMPP)上运行,但我不确定我是否了解重定向的路径。无论我输入什么地址,它总是会按原样转到 localhost\cake\users\login。

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

有人可以插话并帮助我解决此应用程序在运行任何 php 文件之前 采用的“路径”吗?是否将所有内容重定向到 cake\app\webroot,然后重定向到从那里设置的 .htaccess 文件之外的任何重定向? (在这种情况下,蛋糕\用户\登录)

感谢您的帮助!

PS:我很惭愧地说我还没有弄清楚哪个文件的哪个部分正在重定向到所有对用户登录页面的 HTTP 请求。我前一阵子设置了这个,我刚刚回来。我想我正在关注 CakePHP Cookbook 页面上的第二个教程,您可以在其中添加 ACL 功能..

【问题讨论】:

  • 简单的跟踪方法:在每次重写的url中添加一个额外的查询参数:RewriteRule ...?url=$1&amp;from=fileC
  • 马克,“...”应该是别的东西吗?
  • 是的,这是您重写网址的其余部分。只是懒惰不剪切'n粘贴整个东西。重要的是添加&amp;from=fileC 查询参数。
  • 其实,我想我明白你的意思了。我尝试将这些参数添加到每个重写规则中。但是,我并没有真正看到页面加载上显示的任何内容。
  • 你在重写中做重定向,所以它只是内部重写......它们应该出现在服务器的访问日志中。

标签: php .htaccess cakephp redirect


【解决方案1】:

以下行将所有内容重定向到您的索引页面,这是一个 Cake 构造。

RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

在您的情况下,我不认为您的重定向是由您的 .htaccess 文件直接引起的。您的 webroot htaccess 只是将所有内容通过管道传输到您的索引页面。

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

这是我的两分钱。但是,我只是将 CakePHP 用作实验,所以如果我错了,有更多经验的人应该随时纠正我。

【讨论】:

  • 感谢您提供午餐肉317。当我没有像上面那样设置 htaccess 并转到 localhost/cake 时,它​​正在从没有配置文件设置的 \cake 目录中读取文件。例如当正确的位于 cake\app\database.php 中时,它看起来就像是 foe cake\database.php。我看到 cake\app\webroot\index.php 是每个请求使用当前 A、B 和 C 设置重定向到的文件。
  • 嗯,我会进一步研究这个 index.php 文件。我认为我没有修改它(从下载中按原样使用)。
【解决方案2】:

在运行任何 php 文件之前,有人可以帮我解决这个应用程序所采用的“路径”吗?是否将所有内容重定向到 cake\app\webroot,然后重定向到从那里设置的 .htaccess 文件之外的任何重定向? (在这种情况下,蛋糕\用户\登录)

简而言之,是的。只有一个.htaccess 文件在做真正的 工作,那就是“C”(即/app/webroot/.htaccess 中的文件)。这会将任何不针对现有文件或目录的请求传递给index.php,它会引导 CakePHP 并处理请求。任何进一步的“重定向”都由CakePHP's routing 处理。

编辑: 为了解决您关于重定向到登录页面的问题,您可能已经配置了Auth component,并且没有通过$this-&gt;Auth-&gt;allow() 设置任何“公共”页面。


如果您将 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”中的 RewriteRule 处理。这样做是为了保护敏感数据,例如您的数据库连接信息,并确保应用程序正常运行(因为所有请求都应该通过 CakePHP 引导程序,除非您设置了自定义路由)。

【讨论】:

  • 非常感谢贾斯汀!你说的对。我在 cake\app\app_controller.php 中找到了 Auth 组件,并且 BeforeFilter 正在与登录页面一起使用。我很欣赏清晰的解释。这听起来很有意义。
【解决方案3】:

我认为这是由于在您的应用程序中使用了 Auth 组件而发生的。您写道您正在尝试使用 cakephp 的 Acl 组件部分,这是使用 Auth 组件的地方。如果在请求的控制器中包含 Auth 组件,cakephp如果没有指定其他 loin 方法,默认重定向到 /users/login。所以我猜 htaccess 不会在这里造成问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    相关资源
    最近更新 更多