使用PHP编辑.htaccess文件

7
我有一个 .htaccess 文件,它将一个域名映射到一个文件夹。
RewriteEngine On
RewriteBase /

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

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

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


6
@Cyclone:如果做得正确,它不会带来安全风险。 - ThiefMaster
1
仅供参考:假设您的PHP脚本是Web脚本,允许Web脚本更新Web服务器配置(即.htaccess)可能会导致安全灾难。有时是不可避免的,但要非常谨慎。还有,您尝试了什么? - Conrad Shultz
2
如果您没有经验,最好设置一个RewriteMap,这样更容易附加而不会出现语法问题。 - mario
2
@ConradShultz:我认为你不能将它们进行比较。编辑真正的配置文件需要root权限,而.htaccess文件通常由用户拥有,可以被PHP脚本访问。因此,恶意/有缺陷的脚本仍然可以编辑它们。 - ThiefMaster
2
@ThiefMaster:.htaccess 可能会引起的问题程度在很大程度上取决于其他变量(例如 AllowOverride)。我们不知道这种情况是如何设置的。此外,我的 .htaccess 文件明确地被 Apache 设置为不可写,因此它们无法因此被恶意脚本编辑。 - Conrad Shultz
显示剩余6条评论
3个回答

10

如上方评论中建议的那样,最好使用RewriteMap来处理您的情况,而不是直接使用PHP代码编辑.htaccess。以下是如何使用的示例:

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

RewriteMap domainMap txt://path/to/domain-dir.txt
  • 创建一个文本文件,并将其保存为 /path/to/domain-dir.txt,内容如下:

    sub1 /subdir1
    sub2 /foodir2
    foo /bar
    
  • 在你的 .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文件的方法?我在共享主机上。 - Blease
    很遗憾,因为“RewriteMap”指令只能放在httpd.conf文件中,所以无法实现。不过,在httpd.conf中只需要进行一次更改即可。 - anubhava

    4
    这可能适用于您的情况:
    将.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###
    

    假设$rules变量保存了新生成的规则,以下是PHP脚本代码:

    $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权限和脚本的权限。


    0
    您可以使用以下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。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接