php有一个函数nl2br,可以把文本中的换行符变成 《br /》,但是有的时候,我们需要的是单个换行符换行变成《br /》,两个及以上换行符变成《p》。(注:这里的中文书名号其实要写成英文尖括号的,原因你懂得。)
网上搜索nl2p第一个就是cnblogs这个博客,那我姑且当做他是源站点吧。
https://www.cnblogs.com/hejianrong/p/5802010.html
源码摘抄如下

/**
 * Returns string with newline formatting converted into HTML paragraphs.
 *
 * @param string $string String to be formatted.
 * @param boolean $line_breaks When true, single-line line-breaks will be converted to HTML break tags.
 * @param boolean $xml When true, an XML self-closing tag will be applied to break tags (<br />).
 * @return string
 */
function nl2p($string, $line_breaks = true, $xml = true)
{
    // Remove existing HTML formatting to avoid double-wrapping things
    $string = str_replace(array('<p>', '</p>', '<br>', '<br />'), '',$string);
     
    // It is conceivable that people might still want single line-breaks
    // without breaking into a new paragraph.
    if ($line_breaks == true)
        return '<p>'.preg_replace(array("/([\n]{2,})/i","/([^>])\n([^<])/i"), array("</p>\n<p>", '<br'.($xml == true ? ' /' :'').'>'), trim($string)).'</p>';
    else
        return '<p>'.preg_replace("/([\n]{1,})/i", "</p>\n<p>", trim($string)).'</p>';
}

这个函数有两个选项。当然我觉得$xml要恒等于true的,因为现在html5提倡闭合的写法,就是< br / >这样。
然后$line_breaks=false 是换行即换段落,ture是换行就是换行,但是英文会删去前一行最后一个字和第二行第一个字,中文会变成乱码(因为中文通常是2-3字符)。

我想要的功能是一个换行符就是换行,两个或以上就是段落。
但我对正则又不熟悉。最后折腾后终于改造成自己的nl2p。如下

function nl2p($string)
{
    // Remove existing HTML formatting to avoid double-wrapping things
    $string = str_replace(array('<p>', '</p>', '<br>', '<br />'), '',$string);

    // It is conceivable that people might still want single line-breaks
    // without breaking into a new paragraph.
    
      return '<p>'.preg_replace(array("/([\n]{2,})/i","/[\n]/i"), array("</p><p>", '<br />'), trim($string)).'</p>';
}

经过测试,非常完美。

其实之前也看过相关文章,说要修改ssh默认端口22以提高安全性,但也有文章指出,如果对方有意爆破的话,他也可以扫描你所有端口。

我个人比较认同后面的说法,觉得高强度的长密码才是王道。当然也有懒的原因。

但是还是决定要修改端口号了。

原因是看了这篇文章《虚拟主机和VPS的几个区别》http://www.auiou.com/relevant/00001444.jsp
提到“尤其是Linux主机下的/var/log/btmp文件的增长速度特别快”。

笛声大佬评论说:

你怎么总是纠结 /var/log/btmp 这个文件,这个文件你用 lastb -f /var/log/btmp
看看,里面全是记录了失败的登录,就是说有人一直在爆破你的密码,你把sshd的端口改一下,一般就没人来爆破了,我登录了好几台机器去看了,这个文件大小一直是0。

所以虽然目前我的vps没有被破,但是为了节约磁盘空间,还是说干就干。

第一、修改 /etc/ssh/sshd_config
找到#Port 22,再插入一行设置成你想要的端口号,注意不要跟现有端口号重复。建议一万以上的,当然要小于65535。
第二、重启ssh: systemctl restart sshd
第三、用你刚才的端口登录进去,如果成功了,就注释掉port 22,继续重启ssh。
第四、用端口22登录,发现登不了了,再用新端口,能用,那么就恭喜啦!

另附:清空文件的方法

: > filename
> filename  #最简单,推荐
echo "" > filename
echo > filename

1和2两种方式是0字节,3和4两种方式是1字节。

清空多个文件,比如清空多个log:
ls *.log | awk 'NR>1 {print "echo > " $NF }' |sh

为什么要清空文件,而不是删除文件呢?其实还可以写一篇文章,但我还是一并写在这里了。有一次按照网上的文章,删除了许多log文件,但是nginx等却启动不了了,要手动启动。我感觉linux下的软件简直是白莲花,就不能像windows下面的软件一样,自己再生成文件吗?比如Windows下某某软件,我删了他的缓存,启动该软件后,它又重新生成了一堆缓存。感觉自己是习惯了这些流氓行为,而对linux下的白莲花行为不习惯呢!(晕……)

附上勇哥的脚本:

port='3635'; a=''; a2='/etc/ssh/sshd_config'; a1=`cat $a2`; if [[ $a1=~ '#Port 22' ]]; then sed -i "s/#Port 22/Port $port/g" $a2; fi; if [[ $a1 =~ 'Port 22' ]]; then sed -i "s/Port 22/Port $port/g" $a2; fi; if [[ $a1 =~ 'Port ' ]]; then a=''; else sed -i '$a\'"\nPort $port" $a2; fi; reboot;

请修改上述的 port='3635'; 的值.

递归修改目录权限为755,文件权限为644

linux的原则是最小权限够用就行,不相关的文件只需要只读权限即可。

实现方法:递归修改权限方法是通过 find命令 根据文件参数查找到对应的类型之后执行指定权限。

说明:以下**path**为你需要修改的目录的路径。

1.修改所有者:
chown -R root.root path (递归修改指定路径的所有文件为root用户组所有)
如果是网站目录建议修改所有者为:www-data:www-data

2.递归修改目录权限、文件权限:
find -type d|xargs chmod 755
find -type f|xargs chmod 644
方法二:
#find 路径 -type d -exec chmod 755 {} \;
#find 路径 -type f -exec chmod 644 {} \;

Let's encrypt Wildcard(Wildcard其实是通配符的意思,但是网友们喜欢称“野卡”)

网上的代码,我试过很多都不行,下面这个代码是我从certbot官网以及经过本人一些改动得来,在Debian 8 nginx下通过。

apt-get remove certbot
wget https://dl.eff.org/certbot-auto
sudo mv certbot-auto /usr/local/bin/certbot-auto
sudo chown root /usr/local/bin/certbot-auto
sudo chmod 0755 /usr/local/bin/certbot-auto

sudo /usr/local/bin/certbot-auto certonly --manual
解释:certonly 表示只要申请证书,不需要它自动配置nginx,--manual表示手动的意思。
接下来,会有几个yes or no,自己看清楚来选,然后有一个是添加dns解析的,请按提示操作即可。
/usr/local/bin/certbot-auto renew #这个代码是用来更新证书的,其实有一个是加入任务列表,自动更新的,但运行不了,不知道怎么回事。

date("M-d Y , h:i:s")显示的是服务器本地的时间,比如纽约的时间。
time()显示的是时间戳(UTC1970-1-1 0点开始的秒数)。
gmdate("M-d Y , h:i:s")显示的永远是UTC时间,不管服务器本地,也不管php.ini怎样设定,也不管php语句中设置的时区。
如果要显示北京时间可以gmdate("M-d Y , h:i:s",time()+3600*8)

echo 'SERVER_NAME:'.$_SERVER['SERVER_NAME']; //获取当前域名(不含端口号)

echo 'HTTP_HOST:'.$_SERVER['HTTP_HOST'];//获取当前域名(含端口号)

echo 'REQUEST_URI:'.$_SERVER['REQUEST_URI'];//获取当前域名的后缀
看起来第一个和第二个差不多,就是差一个端口号的问题,但是其实不一样。比如nginx的默认主机,里面写“server_name _”;
那么你用ip或者未绑定域名访问它,那么$_SERVER['SERVER_NAME']显示的是是“_”,而$_SERVER['HTTP_HOST']显示的是该ip和该域名。也就是说$_SERVER['SERVER_NAME']显示的是你配置文件里的server name,而$_SERVER['HTTP_HOST']显示的是你浏览器地址栏里面的域名。

一句话,在虚拟主机或者默认主机的conf里面的server{}里面写上
error_page 404 /404.html;
error_page 403 /403.html;
error_page 500 /500.html; #500页面好像不起作用,还是显示ie11或chrome的默认500页面。
就可以了。就是这么简单。
可能有些人会发现,虽然显示了自定义错误页,但是页面状态码是200。怎么回事呢?
因为网上很多教程写error_page 404 = /404.html;
千万不要等于号,改成空格就对了!

如何在Debian 8上安装Linux,Nginx,MySQL,PHP(LEMP)
LEMP国内也常常简写成lnmp。
网上很多文章都不能用的,踩了几次坑。
以下本人实测通过,感谢digitalocean的指南(比vultr和linode全面),本文基本是参考他的。
via https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-debian-8

第1步 - 安装Nginx Web服务器
apt-get update
apt-get install nginx
第2步 - 安装MySQL
apt-get install mysql-server
mysql_secure_installation
第3步 - 安装PHP进行处理
apt-get install php5-fpm php5-mysql
我们现在已经安装了PHP组件,但是我们需要进行一些配置更改以使我们的设置更加安全。
修改/etc/php5/fpm/php.ini
设置cgi.fix_pathinfo=0

重新启动PHP处理器
systemctl restart php5-fpm

第4步 - 配置Nginx以使用PHP处理器
编辑/etc/nginx/sites-available/default 成如下代码

server {
listen 80 default_server;
listen [::]:80 default_server;

root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;

server_name your_server_domain_name;

location / {
try_files $uri $uri/ =404;
}

location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php5-fpm.sock;
}

location ~ /\.ht {
deny all;
}
}

键入以下命令测试配置文件中的语法错误
nginx -t
如果报告了任何错误,请返回并重新检查您的文件,然后再继续。

准备好后,重新加载Nginx以进行必要的更改:
systemctl reload nginx

建立/var/www/html/info.php,输入以下并保存
phpinfo();
?>

访问http://server_domain_or_IP/info.php
可以了,enjoy it。

另附typecho的nginx伪静态
location / {
index index.html index.php;
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}
}

apache或nginx配置ssl,让它们可以https访问。
首先,你要有一个ssl证书,可以收费的,也可以免费的,比如let's encrypt。
推荐freessl.org,它集合了多个证书申请入口,简化你的操作。
在这里不再赘述,我相信大家都会申请。

apache开启ssl访问
可能需要执行a2enmod ssl

在你需要的虚拟主机网站配置文件里加上这几句
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/mzyq.com/full_chain.pem #证书
SSLCertificateKeyFile /etc/apache2/ssl/mzyq.com/private.key #私钥

然后把证书和私钥拷贝到上述位置。
检查apachectl配置文件是否正确: apachectl configtest
重启apache systemctl restart apache2

如何让http自动跳转https
第一种:
修改虚拟主机配置里的
RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
这个意思是如果不是443端口,就统统转到https。

还可以这样
RewriteEngine on
RewriteRule (.*) https://%{SERVER_NAME}$1 [R]
这个就更简单了。

第二种就是在网站根目录下的.htaccess加入(没有这个文件可以自行建立)
RewriteEngine on
RewriteBase /
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
这样也能跳转。
如果没有开通.htaccess支持就点这里 //www.mzyq.com/a/74.html
注意:apache 默认主机如果没有配置ssl,访问https,有默认页面仍显示Forbidden。

nginx开启ssl访问
在你需要的虚拟主机网站配置文件里加上这几句
在server{}里加上
listen 443 ssl;
server_name mzyq.com;
ssl on;
ssl_certificate /etc/nginx/ssl/mzyq.com/full_chain.pem;
ssl_certificate_key /etc/nginx/ssl/mzyq.com/private.key;

然后把证书和私钥拷贝到上述位置。

证书或者私钥可能不是上述的full_chain.pem或private.key的文件名,这个需要自己变通。
路径也是可以自己定义的。
nginx http自动跳转到https的话,要在conf文件里这么写两个server。
主要的server{} 监听443端口,按上面的去写。
再加一个server{}监听80端口。跳转到https就好了。千万不能把两个server混在一起写,否则会无限重定向。
server {

listen  80;  
server_name www.mzyq.com; 
rewrite ^(.*)$  https://$host$1 permanent;  

}

关键词:如何配置ssl,apache配置ssl,nginx配置ssl,开启https访问,证书部署

网上很多文章都是互相抄袭,都没用。以下由本人亲测通过。

apache下的网站默认是会目录索引的,这样不安全。
需要禁止目录索引,修改etc/apache2/httpd.conf (debian是apache2.conf)

找到这一句注释掉即可: Options Indexes FollowSymLinks

还有一种是在网站下放一个.htaccess
加上这个Options -Indexes
我好几次没测试成功,原来原因在于apache默认没开启支持htaccess,要开启支持还是要修改etc/apache2/httpd.conf (debian是apache2.conf)

<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>

None 改成 All
所以还是要修改httpd.conf