如何在每次事物之前写入文件

时间:2016-06-08 14:59:58

标签: php

我正在试图弄清楚如何使用fwrite总是在“RewriteRule之前写。(gif | jpg | js | css)$ - [F]”


这是我的代码

$website = 'mynewsite.com';

$f = fopen(".htaccess", "a+");
fwrite($f, "RewriteCond %{HTTP_REFERER} !^http://(www\.)?".$website."/.*$ [NC]\n");
fclose($f);


我想要的结果是什么:

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?website1.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(www\.)?website2.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(www\.)?website3.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(www\.)?mynewsite.com/.*$ [NC]
RewriteRule \.(gif|jpg|js|css)$ - [F]


我知道你可能不应该使用php写入.htaccess文件,但.htaccess文件所在的位置,确实不需要安全性。

感谢您的时间!我希望有一个人可以帮助我! :)

2 个答案:

答案 0 :(得分:0)

您需要做的是在打开文件之后/在写入文件之前移动文件指针。有几种方法可以做到这一点。

PHP为此提供函数fseek()。手册说明:

  

注意:
  如果以附加(a或+)模式打开文件,则无论文件位置如何,都会追加写入文件的任何数据,并且调用fseek()的结果将是未定义的。

因此,首先我们需要更改我们打开文件的模式。r+,这与a+相同,但将指针放在开头似乎是一个不错的选择。 (见PHP manual for fopen()

接下来,我们需要将指针移动到正确的位置。

fseek()可以根据以下内容移动指针:文件的开头(SEEK_SET),文件的结尾(SEEK_END)或当前指针位置({{1} })。正数向前移动,负数向后移动。

在您的情况下,最后的数据是固定的,因此我们从文件末尾向后计数。

SEEK_CUR有37个字符。

指针以字节为单位设置,因此确切的数据量取决于文件编码。假设ASCII,这使得37个字节。 请注意,文件末尾的换行符会增加1或2个字节,具体取决于您的行结尾(RewriteRule \.(gif|jpg|js|css)$ - [F]LF

CRLF

另一个,更便携(因为它不依赖于你想要在之前写的行中的固定字节数,或者它是最后一行)的方式是:

使用fgets()逐行读取文件。将您读取的数据与您期望在您要查找的行中的数据进行比较(如果您不知道确切的内容,请使用正则表达式进行比较)。

如果找到该行,计算它有多少字节, THEN 再次使用$website = 'mynewsite.com'; $f = fopen(".htaccess", "r+"); fseek($f, -38, SEEK_END); fwrite($f, "RewriteCond %{HTTP_REFERER} !^http://(www\.)?".$website."/.*$ [NC]\n"); fclose($f); 移动许多字节后面的光标(fseek()将指针留在它返回的数据的结尾)

然后写。

答案 1 :(得分:0)

我遇到了一个解决方案。代码如下。

我使用了str_replace!

$fname = ".htaccess";
$fhandle = fopen($fname,"r+");
$content = fread($fhandle,filesize($fname));

$content = str_replace("RewriteRule \.(gif|jpg|js|css)$ -
[F]", "RewriteCond %{HTTP_REFERER} !^http://(www\.)?".www.google.com"/.*$ [NC] 
\nRewriteRule \.(gif|jpg|js|css)$ - [F]", $content);

$fhandle = fopen($fname,"w");
fwrite($fhandle,$content);
fclose($fhandle);