【问题标题】:Edit .htaccess with PHP使用 PHP 编辑 .htaccess
【发布时间】:2012-01-17 18:33:40
【问题描述】:

我有一个将域映射到文件夹的 .htaccess。

RewriteEngine On
RewriteBase /

# redirect mapped domain
ReWriteCond %{HTTP_HOST} joshblease.uk.to
ReWriteCond %{REQUEST_URI} !gme-index/
ReWriteRule ^(.*)$ gme-index/$1 [L]

有没有办法使用 PHP 编辑/添加额外的域映射到文件?

简单地说,我想获取 .htaccess 文件的内容并使用 PHP 脚本添加到其中。

【问题讨论】:

  • @Cyclone:如果处理得当,不会有安全风险。
  • 只是把它扔在那里:假设您的 PHP 脚本是一个 Web 脚本,让一个 Web 脚本更新 Web 服务器配置(这就是 .htaccess 是什么)是潜在的安全灾难。有时它可能无法避免,但要非常小心。是的,你尝试过什么?
  • 如果你没有这方面的经验,你应该设置一个RewriteMap,它更容易附加而不会出现语法问题。
  • @ConradShultz:我认为您无法比较这些。编辑 real 配置文件需要 root 权限,而 .htaccess 文件通常归 PHP 脚本可以访问的用户所有。因此,恶意/错误的脚本无论如何都可以编辑它们。
  • @ThiefMaster:.htaccess 能把事情搞砸的程度在很大程度上取决于其他变量(例如 AllowOverride)。我们不知道在这种情况下是如何设置的。此外,我的 .htaccess 文件是 Apache 明确不可写的,因此它们不能被恶意脚本编辑。

标签: php .htaccess mapping dns edit


【解决方案1】:

正如上面其中一个 cmets 所建议的,最好在此处针对您的情况使用 RewriteMap,而不是尝试直接从 PHP 代码编辑 .htaccess。以下是如何使用它的示例:

  1. 将以下行添加到您的 httpd.conf 文件中:

    RewriteMap domainMap txt://path/to/domain-dir.txt
    
  2. 像这样以/path/to/domain-dir.txt 创建一个文本文件:

    sub1 /subdir1
    sub2 /foodir2
    foo /bar
    
  3. 在您的 .htaccess 文件中添加以下行:

    Options +FollowSymLinks -MultiViews
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com$ [NC]
    RewriteRule ^$ ${domainMap:%1} [L,R]
    

实际上,所有这些意味着将这些重定向到位:

  • sub1.domain.com/ => sub1.domain.com/subdir1
  • sub2.domain.com/ => sub2.domain.com/foodir2
  • foo.domain.com/ => foo.domain.com/bar

优势:有了这个设置,你可以从你的 php 代码中编辑或重新创建文件/path/to/domain-dir.txt,而不会打开一个巨大的安全漏洞,允许编辑 php 代码。 htaccess 直接访问。

【讨论】:

  • 在没有 httpd.conf 文件的情况下有没有办法做到这一点?我在共享主机上。
  • 很遗憾没有,因为RewriteMap 指令只进入 httpd.conf 文件。然而,这将只是 一次在 httpd.conf 中的更改。
【解决方案2】:

这可能适用于您的情况:

将 .htaccess 修改为如下所示:

RewriteEngine On
RewriteBase /

# redirect mapped domain
ReWriteCond %{HTTP_HOST} joshblease.uk.to
ReWriteCond %{REQUEST_URI} !gme-index/
ReWriteRule ^(.*)$ gme-index/$1 [L]

###CUSTOM RULES###

php 脚本假设 $rules 包含要修改的新生成规则;

$htaccess = file_get_contents('/path/to/.htaccess');
$htaccess = str_replace('###CUSTOM RULES###', $rules."\n###CUSTOM RULES###", $htaccess);
file_put_contents('/path/to/.htaccess', $htaccess);

上面的例子是理论上的,没有经过测试,将取决于脚本的 .htaccess 权限和权限。

【讨论】:

    【解决方案3】:

    您可以使用以下 htaccess 将maindomain.com 以外的任何域映射到与域名同名的文件夹。

    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    ReWriteCond %{HTTP_HOST} !maindomain.com
    ReWriteCond %{HTTP_HOST} (.*)
    ReWriteRule ^(.*)$ %1/$1 [L]
    

    或者;将文件夹映射到不带 ltd 的域名。

    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    ReWriteCond %{HTTP_HOST} !maindomain.com
    ReWriteCond %{HTTP_HOST} ^([^\.]*)
    ReWriteRule ^(.*)$ %1/$1 [L]
    

    不完全是你想要的,但它可能对你有用,并且不需要任何 php。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-14
      • 2023-04-08
      • 2021-03-16
      • 2018-10-21
      • 1970-01-01
      • 2010-10-09
      • 2013-05-07
      • 1970-01-01
      相关资源
      最近更新 更多