【问题标题】:Is PHP allowed to modify .htaccess file in current folder?是否允许 PHP 修改当前文件夹中的 .htaccess 文件?
【发布时间】:2010-10-08 16:37:33
【问题描述】:

我有一个位于 共享主机 上的 PHP 网络应用程序。 我的目标是在 PHP 页面运行时从 PHP 代码修改 .htaccess 文件。 我需要那个 .htaccess 在其中插入几行 mod_rewrite 行。

问题是在 Windows+Apache 上我可以动态修改 .htaccess 文件 但是当我尝试以任何方式访问此文件时,Linux 上的相同代码会报告一个问题 方式(复制或打开):

"failed to open stream: Permission denied"

我已授予 .htaccess 文件 777 权限 - 仍然没有结果。 是什么阻止我这样做?如何制定解决方法?

附: 我最初的目标是能够将一个新的 RewriteRule 添加到 .htaccess 中,它映射一个 新添加的 category_id 和新的 category_name。

如果不是共享主机,我会使用 RewriteMap(在主要 Apache 配置中)之类的东西,并且能够访问地图文件。

这是我用 PHP+Apache 无法解决的第一个真正的限制,但我希望它也是可以规避的。

【问题讨论】:

  • 不建议让 PHP 像这样动态管理 .htaccess,如果它被泄露,就会发生坏事。我猜有 SELinux 或其他一些安全层阻止 PHP 出于这个原因这样做。我同意 Chad Birch 的观点,多采用 MVC 方法。

标签: php apache .htaccess mod-rewrite permissions


【解决方案1】:

这似乎是一个过于复杂的解决方案,因为只有一个通用的“加载类别”页面从 URL 中获取类别名称并加载相应的 ID。

例如,如果 URL 是:

http://yoursite.com/category/programming

我会将其重新映射为:

http://yoursite.com/category.php?name=programming

【讨论】:

  • +1 对于这个想法...让网络服务器写入 .htaccess 文件(或文档根目录下的任何文件)几乎总是一个糟糕的设计。
  • 您是在谈论某种通用的前端控制器页面吗?所以这就是我拥有的任何新类别,例如IT/programming 或 1/2/3/subcat4 我只是将他们发送到主控制器页面,该页面从 REQUEST_URI 变量读取 SEO 链接并将用户重定向到 accoding page.php?id=x。
  • 它不必是所有东西的单个前端控制器。如果需要,您可以将 /category/programming 重定向到 category.php?name=programming 并将 /post/hello-world 重定向到 post.php?name=hello-world。这取决于您如何做这部分,任何事情都比更改 .htaccess 更好。
【解决方案2】:

我同意乍得·伯奇的观点。但是,如果您不能被劝阻,在您的情况下,我会首先寻找具有锁定权限的父目录。

仅供参考,重写 .htaccess 是一个坏主意的原因之一是, .htaccess 被重写时传入的任何请求都不会应用您的任何重定向。

【讨论】:

    【解决方案3】:

    您只需要一小组重写规则。按照乍得的建议去做:

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^/category/.*$ category.php [QSA]
    

    因此,任何时候有人导航到/category/category_id,请求都会被定向到category.php,这将被传递到$_SERVER['REQUEST_URI'] 中的/category/ URI,您可以从中轻松获取类别ID,并且您不需要每次添加类别时都无需费心编辑 .htaccess 文件。

    【讨论】:

      【解决方案4】:

      我想推荐一些其他也有效的方法。与其为每个“特殊”网址编写规则,不如为所有人使用一个规则?

      我发现使用 wordpress 使用的东西要容易得多:每个 url 都被重定向到索引。

      您所要做的就是设置索引文件,读入加载的目录(可能使用 $_SERVER['URI_REQUEST']),然后处理它。

      添加到 .htaccess 中:

      <IfModule mod_rewrite.c>
      RewriteEngine On
      RewriteBase /
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule . /index.php [L]
      </IfModule>
      

      多亏了这个大块,您可以使用一个不受限制的系统。如果您想重命名您的类别 url,或者添加另一个特殊情况,它已经准备好了!

      【讨论】:

        【解决方案5】:

        虽然我同意上述 cmets,但绝对可以做到。像 WordPress 这样的 PHP 应用程序正是根据设置页面上所做的更改来执行此操作的。它应该像写出文件一样简单,但是父目录需要具有 Web 服务器用户写入它的权限。

        如果它不适合你,诀窍是将父目录设置为 777 或 775,并将组设置为 Apache 运行的任何组(通常是“apache”或“www”或类似的东西)

        Adam(对您的问题发表了评论)虽然非常正确,但您服务器上的其他一些安全层可能会阻止您这样做,这可能很好地表明您可能以错误的方式解决问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-11-27
          • 2016-07-20
          • 1970-01-01
          • 2016-03-23
          • 2020-05-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多