【问题标题】:PHP root with .htaccess带有 .htaccess 的 PHP 根目录
【发布时间】:2015-02-25 03:49:37
【问题描述】:

我正在使用 000webhost,它使用根文件夹中的 public_html 文件夹作为站点的可见根。在那个文件夹中,我有一个包含一些 PHP 脚本的 assets 文件夹,还有一个包含 PHP 索引页面的文件夹。使用 require "/assets/includes/scriptname.php"; 不起作用,因为它试图找到 public_html 的同级文件夹。我可以编辑 .htaccess 以更改相对于 PHP 查找的根文件夹,但我不知道如何。

文件树:

public_html (within root, but simulated root)
   folder1
      index.php
   folder2
      index.php
   folder3
      index.php
   assets
      subfolder
      subfolder
   index.php

简而言之,我如何在/public_html/ 中创建提到的代码点而不显式声明它(最好作为 .htaccess 更改,因为我希望我的代码能够在不重写任何内容的情况下移动到不同的主机)。

对于 .htaccess 重写的答案,您能解释一下它的每一行是如何工作的吗?谢谢。

【问题讨论】:

  • 不会require "/..." 查找与文件系统/ 相关的文件吗?除非您以某种方式chroot 脚本,否则它应该如何工作?我会使用相对路径,或者将include_path 设置为assets/includes,然后只设置require "scriptname.php"
  • 我在想一些类似于stackoverflow.com/questions/9413127/…stackoverflow.com/questions/16512881/… 的东西——它对我的目的有用吗? (很可能是第一个)
  • chdir($_SERVER['DOCUMENT_ROOT']); require "assets/..."; 应该没问题。
  • 这给出了一个错误,指出存在 open_basedir 限制。
  • @Firedrake969 这个问题是 mod_rewrite 重写了 requests 而你使用的是 php 的 require 与请求无关,不会被它处理

标签: php .htaccess mod-rewrite


【解决方案1】:

.htaccess 对你没有帮助。它是 Apache 配置,不会以任何方式影响 PHP 的行为。

代码:

require "/assets/includes/scriptname.php"

告诉 PHP 使用绝对路径包含一个文件。不建议使用硬编码的绝对路径,因为当您将代码移到另一个目录或具有不同路径的不同服务器上时,该代码将不起作用。

指定包含文件路径的最佳方法是在运行时生成它,从包含器的路径开始。 PHP 函数dirname() 和常量__DIR__ 是这里的助手。

给定示例文件结构:

public_html
   |
   +- index.php
   |
   +- assets
   |     |
   |     +- somescript.php
   |
   +- includes
         |
         +- header.php
         |
         +- footer.php

假设您需要在index.php 中包含assets/somescript.php。写在index.php:

 require __DIR__.'/assets/somescript.php';

魔术常量__DIR__ 包含使用它的文件的目录。对于index.php__DIR__ 设置为'/(...path-to-your-user-directory...)/public_html'

如果somescript.php 需要包含header.php,它应该这样做:

require dirname(__DIR__).'/includes/header.php';

等等。

这样,您可以将整个应用程序移动到不同的目录、不同的服务器甚至不同的操作系统上,它仍然可以工作。

【讨论】:

  • 对于您的第一个 require 代码,您使用了 __DIR__,而对于您的第二个代码,您使用了 dirname(__DIR__)。始终将其保留为 __DIR__ 或 dirname(__DIR__) 是否安全?如果有,是哪一个?有什么区别?
  • assets/somescript.php__DIR__'/..../public_html/assets'。在附加 /includes/header.php 之前,您需要上一层(到 public_html)。
  • 所以不管基本文件夹是什么,使用dirname(__DIR__) 应该可以吗?即使没有命名基本文件夹? (就像它直接在 public_html 旁边而不是在 public_html 中)
  • 阅读文档,思考一下,做一些测试(echo(__DIR__)echo(dirname(__DIR__))echo(dirname(dirname(__DIR__))),诸如此类),突然一切都会变得更加清晰。
  • 好的,会的。谢谢! :)
猜你喜欢
  • 2018-04-29
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
  • 2023-04-01
  • 2013-10-02
  • 1970-01-01
相关资源
最近更新 更多