我的脚本根据传递给它的信息将一组htaccess规则放在一起,并为用户提供一个可下载的文本文件,其中包含打印出来的规则。我们的想法是,管理员填写一些表单信息,单击可下载的链接,获取内部打印规则的文本文件,打开文件,复制规则并将其粘贴到其域的htaccess文件中。
我设法将产生这些规则的脚本放在一起。但是,文本文件似乎忽略了我打印到它的所有换行符。选项卡有效,但换行符不起作用。它必须与我在header()函数调用中使用的编码有关,但我不确定我做错了什么。没有任何谷歌搜索似乎指向我正确的方向。任何意见都将不胜感激。
以下是代码:
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="htaccess.txt"');
header('Content-Transfer-Encoding: binary');
$id = addslashes( $_GET['id']);
$location = addslashes( $_GET['location'] );
$location = substr($location, strpos($location, '/', 9 ) + 1 ) . ( ( substr( $location, strlen($location) - 1 ) == '/' ) ? '' : '/' );
$regEx = '([0-9a-zA-Z-_]*)';
$lines = array();
for( $x = 0; $x < 10; $x++ ) {
$line = 'RewriteRule ^' . $location;
for( $y = 1; $y <= $x; $y++ )
$line .= $regEx . '/';
$line .= '*$' . "\t\t\t\t\t";
$line .= "http://localhost/redirect.php?ring=$id";
$line .= ( $x >= 1 ) ? '&link=$1' : '';
$line .= ( $x > 1 ) ? '&tag' . ( $x - 1 ) . '=$' . $x . ' [NC]' . "\n" : "\n";
$lines[] = $line;
}
foreach( $lines as $line )
echo $line;
答案 0 :(得分:3)
Windows并不总是理解"\n"
。 Windows使用"\r\n"
作为换行符的默认值。
答案 1 :(得分:0)
尝试使用"\r\n"
代替"\n"
Linux: \n
Mac: \r
Win: \n\r
答案 2 :(得分:0)
他们为我工作。你在Windows机器上开发?如果是这样,你可能想要使用\ r \ n或更好的PHP_EOL常量,它与环境无关。
答案 3 :(得分:0)
您是在Windows系统还是unix系统上进行测试?我似乎记得unix系统在文本文件中使用与windows系统不同的行结束字符。
维基百科建议
“另一个常见问题是使用 '\ n'使用时进行通信 强制要求的互联网协议 使用ASCII CR + LF作为结束行。 将'\ n'写入文本模式流 在Windows系统上正常工作, 但是在Unix上只产生LF,而且 一些完全不同的东西 奇异的系统。在二进制文件中使用“\ r \ n” 模式稍微好一点,因为它的工作原理 在许多与ASCII兼容的系统上,但是 在一般情况下仍然失败。一 方法是使用二进制模式和 指定的数值 控制序列直接, “\ X0D \ X0A”。“
答案 4 :(得分:0)
现在我对这两个标题感到有些困惑:
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
通常,八位字节流用于二进制可执行文件。由于内容是纯文本,我在将编码设置为“二进制”时也没有任何意义。
使用\ r \ n作为换行符是安全的,因为它适用于UNIX-derviates以及Microsoft Windows机器。
至于内容类型,我建议您使用“text / plain”。