我正在试图弄清楚如何使用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文件所在的位置,确实不需要安全性。
感谢您的时间!我希望有一个人可以帮助我! :)
答案 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);