月份: 2012-07

解决unknown limit item ‘noproc’

这段时间为了对付攻击,看了几天的日志,发现每次看/var/log/secure这个日志的时候,都比上次增加了很多,除了被攻击出现的尝试登陆SSH外,还有一些东西

Apr 27 20:01:06 www crond[9449]: pam_limits(crond:session): unknown limit item ‘noproc’
Apr 27 20:01:06 www crond[9449]: pam_limits(crond:session): unknown limit item ‘noproc’
Apr 27 21:01:03 www crond[9541]: pam_limits(crond:session): unknown limit item ‘noproc’
Apr 27 21:01:03 www crond[9541]: pam_limits(crond:session): unknown limit item ‘noproc’
Apr 27 21:04:04 www sshd[9562]: pam_limits(sshd:session): unknown limit item ‘noproc’
Apr 27 21:04:04 www sshd[9562]: pam_limits(sshd:session): unknown limit item ‘noproc’
就是上边这些东西,占据了日志的大部内容,几乎1分钟就出一堆。”unknown limit item ‘noproc’”意思是未知的限制单位,看样子是关于limit session的,就是限制对话数的最大上限。查了一下资料,这东西归/etc/security/limits.conf这个配置文件管的,打开看了一下,里面有配置说明

# can be one of the following:\r\n
# – core – limits the core file size (KB)\r\n
# – data – max data size (KB)\r\n
# – fsize – maximum filesize (KB)\r\n
# – memlock – max locked-in-memory address space (KB)\r\n
# – nofile – max number of open files\r\n
# – rss – max resident set size (KB)\r\n
# – stack – max stack size (KB)\r\n
# – cpu – max CPU time (MIN)\r\n
# – nproc – max number of processes\r\n
# – as – address space limit (KB)\r\n
# – maxlogins – max number of logins for this user\r\n
# – maxsyslogins – max number of logins on the system\r\n
# – priority – the priority to run user process with\r\n
# – locks – max number of file locks the user can hold\r\n
# – sigpending – max number of pending signals\r\n
# – msgqueue – max memory used by POSIX message queues (bytes)\r\n
# – nice – max nice priority allowed to raise to values: [-20, 19]\r\n
# – rtprio – max realtime priority
看到高亮的部分没,是不是和我们的出错的信息”noproc“这东西很像,应该它就是罪魁祸首了。再往下看这个配置文件

# End of file\r\n
* soft noproc 65535
* hard noproc 65535
* soft nofile 65535
* hard nofile 65535

不用我说,你也知道是什么原因了吧,应该把noproc改成nproc,意思就是最大的进程数(对话数)。

按理说原来肯定是没有错的,可能是LNMP一键按装包里有错误,希望作者可以把这个错误修正了,不然广大使用者都不知道错在什么地方。

转自http://www.noisyguy.com/archives/214.html

用php更改非php输出内容

前几天有个需求,就是将页面输出的内容进行过滤… 进行域名更换…
比如本来将输出的www.csdn.net/image/上面的图片内容,现在迁移到了cdn上面,域名更改为cdn.csdn.net/image/
再不更改模版的基础上,直接将输出进行修正…

实现过程
1.将所有输出放到output buffer里面
2.在php脚本结束后对output buffer进行修改过滤,再输出.

so测试如下:
原输出假设是如下:







那么在输出html前,加入到php执行中如下代码即可进行html内容的替换

  

则输出变成







重点在于
1.ob_xxx函数 output buffer控制
2.register_shutdown_function函数 注册一个脚本结束时运行的函数..

注意:
1.register_shutdown_function的这个输出必须是最后一个register的…
2.如果流程中有output buffer控制函数,需要具体情况具体分析,进行使用.

转自http://blog.csdn.net/sunvince/article/details/6312971

ET设置文件下载采集图片发布后图片地址错误

采集内容到帝国,

newstext=

这里是发送代码的内容,都是正确的,设定了附件域名,也正常上传,但是发布后,实际帝国中出现的地址为

src="https://XXXX/d/file/201206/b036aac966ec17834afa754bacb083bf.jpg

即文件名h1896251705331.jpg,变为了b036aac966ec17834afa754bacb083bf.jpg 。变成的这个地址也不是原先采集地方的图片地址。

解决方法是在发布配置里面设置发布参数copyimg=0,去掉接口自带的图片下载功能,因为两者只能使用一种来下载图片,否则会造成冲突。

个别自动备份脚本不执行的解决方法

个别自动备份脚本不执行的解决方法

在添加crontab命令定时启动脚本的后面,加上” > /dev/null 2>&1″。
如:
00 03 * * * /home/AutoBackupToFtp.sh > /dev/null 2>&1

下面是一个关于”/dev/null 2>&1″的解释

cmd >a 2>a 和 cmd >a 2>&1 为什么不同?
cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件会被打开两遍,由此导致stdout和stderr互相覆盖。
cmd >a 2>&1 :stdout直接送往文件a ,stderr是继承了FD1的管道之后,再被送往文件a 。a文件只被打开一遍,就是FD1将其打开。
他们的不同点在于:

cmd >a 2>a 相当于使用了FD1、FD2两个互相竞争使用文件 a 的管道;
而cmd >a 2>&1 只使用了一个管道FD1,但已经包括了stdout和stderr。
从IO效率上来讲,cmd >a 2>&1的效率更高。

****************************************
经常可以在一些脚本,尤其是在crontab调用时发现如下形式的命令调用

/tmp/test.sh > /tmp/test.log 2>&1
前半部分/tmp/test.sh > /tmp/test.log很容易理解,那么后面的2>&1是怎么回事呢?

要解释这个问题,还是得提到文件重定向。我们知道>和<是文件重定向符。那么1和2是什么?在shell中,每个进程都和三个系统文件 相关联:标准输入stdin,标准输出stdout和标准错误stderr,三个系统文件的文件描述符分别为0,1和2。所以这里2>&1 的意思就是将标准错误也输出到标准输出当中。

下面通过一个例子来展示2>&1有什么作用:

$ cat test.sh
t
date
test.sh中包含两个命令,其中t是一个不存在的命令,执行会报错,默认情况下,错误会输出到stderr。date则能正确执行,并且输出时间信息,默认输出到stdout

./test.sh > test1.log
./test.sh: line 1: t: command not found

$ cat test1.log
Tue Oct 9 20:51:50 CST 2007
可以看到,date的执行结果被重定向到log文件中了,而t无法执行的错误则只打印在屏幕上。

$ ./test.sh > test2.log 2>&1

$ cat test2.log
./test.sh: line 1: t: command not found
Tue Oct 9 20:53:44 CST 2007
这次,stderr和stdout的内容都被重定向到log文件中了。

实际上, > 就相当于 1> 也就是重定向标准输出,不包括标准错误。通过2>&1,就将标准错误重定向到标准输出了,那么再使用>重定向就会将标准输出和标准错误信息一同重定向了。如果只想重定向标准错误到文件中,则可以使用2> file。

linux shell 中”2>&1″含义脚本是:
nohup /mnt/Nand3/H2000G >/dev/null 2>&1 &
对于& 1 更准确的说应该是文件描述符 1,而1 一般代表的就是STDOUT_FILENO,实际上这个操作就是一个dup2(2)调用.他标准输出到all_result ,然后复制标准输出到文件描述符2(STDERR_FILENO),其后果就是文件描述符1和2指向同一个文件表项,也可以说错误的输出被合并了.其中0 表示键盘输入 1表示屏幕输出 2表示错误输出.把标准出错重定向到标准输出,然后扔到/DEV/NULL下面去。通俗的说,就是把所有标准输出和标准出错都扔到垃圾桶里面。
command >out.file 2>&1 &
command >out.file是将command的输出重定向到out.file文件,即输出内容不打印到屏幕上,而是输出到out.file文件中。 2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中。最后一个& , 是让该命令在后台执行。

试想2>1代表什么,2与>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出;
换成2>&1,&与1结合就代表标准输出了,就变成错误重定向到标准输出.

你可以用
ls 2>1测试一下,不会报没有2文件的错误,但会输出一个空的文件1;
ls xxx 2>1测试,没有xxx这个文件的错误输出到了1中;
ls xxx 2>&1测试,不会生成1这个文件了,不过错误跑到标准输出了;
ls xxx >out.txt 2>&1, 实际上可换成 ls xxx 1>out.txt 2>&1;重定向符号>默认是1,错误和输出都传到out.txt了。
为何2>&1要写在后面?
command > file 2>&1
首先是command > file将标准输出重定向到file中, 2>&1 是标准错误拷贝了标准输出的行为,也就是同样被重定向到file中,最终结果就是标准输出和错误都被重定向到file中。
command 2>&1 >file
2>&1 标准错误拷贝了标准输出的行为,但此时标准输出还是在终端。>file 后输出才被重定向到file,但标准错误仍然保持在终端。

用strace可以看到:
1. command > file 2>&1
这个命令中实现重定向的关键系统调用序列是:
open(file) == 3
dup2(3,1)
dup2(1,2)

2. command 2>&1 >file
这个命令中实现重定向的关键系统调用序列是:
dup2(1,2)
open(file) == 3
dup2(3,1)

可以考虑一下不同的dup2()调用序列会产生怎样的文件共享结构。请参考APUE 3.10, 3.12

————————

/dev/null 2>&1 解释
crontab内容 :50 18 5-30 * * /script/myscript.sh 1> /dev/null 2>&1
其中 1> /dev/null 2>&1是什么意思??
dev/null 为系统垃圾箱
&为后台运行
但是 myscript 后面的1 和 /null后面的2 还有 &后面的1是什么意思?
1代表标准输出,2代表错误信息输出.
1>/dev/null 就是指将标准输出定向到空设备,
2>&1,的意思是将错误输出定向到和1一样的输出设备,也同样是空.
换句话说,就是不显示该程序执行过程中的任何信息
cmd >a 2>a 和 cmd >a 2>&1 为什么不同?
cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件会被打开两遍,由此导致stdout和stderr互相覆盖。
cmd >a 2>&1 :stdout直接送往文件a ,stderr是继承了FD1的管道之后,再被送往文件a 。a文件只被打开一遍,就是FD1将其打开
他们的不同点在于:
cmd >a 2>a 相当于使用了FD1、FD2两个互相竞争使用文件 a 的管道;
而cmd >a 2>&1 只使用了一个管道FD1,但已经包括了stdout和stderr。
从IO效率上来讲,cmd >a 2>&1的效率更高。
————————————-

为什么要用 /dev/null 2>&1 这样的写法.这条命令的意思是将标准输出和错误输出全部重定向到/dev/null中,也就是将产生的所有信息丢弃.下面我就为大家来说一下, command > file 2>file 与command > file 2>&1 有什么不同的地方.
首先~command > file 2>file 的意思是将命令所产生的标准输出信息,和错误的输出信息送到file 中.command > file 2>file 这样的写法,stdout和stderr都直接送到file中, file会被打开两次,这样stdout和stderr会互相覆盖,这样写相当使用了FD1和FD2两个同时去抢占file 的管道.
而command >file 2>&1 这条命令就将stdout直接送向file, stderr 继承了FD1管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容.
从IO效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,较多的时候我们会用command > file 2>&1 这样的写法.
****************************************************
in UNIX
0 = stdin
1 = stdout
2 = stderr

>/dev/null 2>&1 means
redirect all the standard out and standard error messages/output/results from the programs/scripts to /dev/null ( which means they go to a bottomless pit)

*****************************************************

/dev/null 2>&1

You need to understand the theory first and then its upto you how and where you want to apply that theory. I’ll try to explain above to you.

The greater-than (>) in commands like these redirect the program’s output somewhere. In this case, something is being redirected into /dev/null, and something is being redirected into &1.

Standard in, out and error:

There are three standard sources of input and output for a program. Standard input usually comes from the keyboard if it’s an interactive program, or from another program if it’s processing the other program’s output. The program usually prints to standard output, and sometimes prints to standard error. These three file descriptors (you can think of them as “data pipes”) are often called STDIN, STDOUT, and STDERR.

Sometimes they’re not named, they’re numbered! The built-in numberings for them are 0, 1, and 2, in that order. By default, if you don’t name or number one explicitly, you’re talking about STDOUT.

That means file descriptor 0 or fd0 denotes STDIN or standard input and file descriptor 1 or fd1 denotes STDOUT or standard output and file descriptor 2 or fd2 denotes STDERR or standard error.

You can see the command above is redirecting standard output into /dev/null, which is a place you can dump anything you don’t want (often called the bit-bucket), then redirecting standard error into standard output (you have to put an & in front of the destination when you do this).

The short explanation, therefore, is “all output from this command should be shoved into a black hole.” That’s one good way to make a program be really quiet!

*********************************************
When in a shell, you can do various things with the output and input to commands. You can run them through a pipe:

grep root /var/log/messages | less

This takes the output of the ‘grep’ commands, and uses the ‘less’ paginator to finally display it on the screen.

To go into further detail, this sends the STDOUT of ‘grep’ to less.

If you wanted to send the output to a file, you’d use a redirect:

grep root /var/log/messages > /tmp/file

This takes the STDOUT, and sticks it into ‘/tmp/file’. I won’t go into detail about the > and >> options etc. as they are all covered in the man page.

There are 3 file descriptors for every process. STDIN, STDOUT and STDERR. These map to 0, 1 and 2 respecitvly.

Strangely enough, the above command can also be written as:

grep root /var/log/messages 1> /tmp/file

The first command makes the assumption that you want to redirect STDOUT. This one clears up that assumption.

Now we’ll look at STDERR:

grep root /var/log/mseeagse > /tmp/file

This will spit out an error to your tty, even though you’ve redirected the output.

grep root /var/log/mseeagse 2> /tmp/file

This one will output nothing, and ‘/tmp/file’ will contain the error. If we didn’t miss-spell the messages file name, any errors that might occur would go to the file, but the output will go to the TTY.

Now we’ll do the last confusing thing, moving a file descriptor to a different one. This is where the & comes in:

grep root /var/log/mseeagse 2> &1

This moves STDERR so it comes out in the same place as STDOUT. It says “Move file descriptor 2 to file descriptor 1”.

Thus where we get to your tail. We mix and match the STDOUT and STDERR redirections:

grep root /var/log/messages > /tmp/file 2> &1
grep root /var/log/mseeagse > /tmp/file 2> &1

With both of these commands, both the regular output (STDOUT), and any errors that occur (STDERR) will go into ‘/tmp/file’.

When stacking redirects like this, there is one major thing to be aware of. When you move a file descriptor, you have to make sure the descriptor you are moving too has already been redirected to where you want, otherwise you can get some… interesting results.
************************************************************
This is from memory.
Everything in Linux is a file, including I/O. There are three standard file descriptors, Standard In (STDIN, file descriptor 0), Standard Output (STDOUT, file descriptor 1) and Standard Error (STDERR, file descriptor 2). /dev/null is the null device, which is like “write only memory”. > will write to the specified file (overwriting its contents) and >> will append to the specified file.

2> redirects STDERR to the specified file. >> is used to append to the end of the file.

& only means to run the process in the background if it appears at the end of the line.

2>&1 redirects STDERR to STDOUT. Since in this case, STDOUT is being redirected to /dev/null, 2>&1 causes both STDERR and STDOUT to /dev/null.

linux网卡设置文章集合

最近面临增加IP,还有加入IPv6,设置网卡网关掩码等信息的问题,总是对linux不熟,找了3篇文章贴在下面,以备以后查询。
另外配置好后,一定要重启一下网卡,命令为/etc/init.d/network restart

CentOS Linux XEN / OpenVZ VPS 增加额外IP

手头有2台vps,分别是基于xen与openvz虚拟化技术,系统为centos linux。

需要对他们增加额外的ip,XEN的默认网卡为eth0,OpenVZ的默认网卡为venet0,网卡的配置文件均位于/etc/sysconfig/network-scripts/目录下。

对XEN VPS进行操作如下:

cd /etc/sysconfig/network-scripts/
cp ifcfg-eth0 ifcfg-eth0:0
vi ifcfg-eth0:0
将其中属于eth0的信息修改为eth0:0然后退出保存
ifup eth0:0
eth0一般配置如下:

DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR=111.111.111.111
NETMASK=255.255.255.0
对OpenVZ VPS进行操作如下:

OpenVZ VPS有点特别,默认的venet0网卡存放的是ip为127.0.0.1,绑定ipv6地址(如果有),ipv4地址绑定在venet0:0上。以venet0:0为例,增加额外ipv4的ip。

cd /etc/sysconfig/network-scripts/
cp ifcfg-venet0:0 ifcfg-venet0:1
vi ifcfg-venet0:1
将其中属于venet0:0的信息修改为venet0:1然后退出保存
ifup venet0:1
venet0:0一般配置如下:

DEVICE=venet0:0
ONBOOT=yes
IPADDR=222.222.222.222
NETMASK=255.255.255.255

在Linux下有时候需要给一个网卡绑定多个IP,本文介绍在Redhat系列(redhat,Fedora Core,Centos)中的实现方法和一种在Gentoo等其他Linux中普遍适用的方法。

1、单网卡绑定多IP在Redhat系列中的实现方法
  假设需要绑定多IP的网卡是eth0,请在/etc/sysconfig/network-scripts目录里面创建一个名为ifcfg-eth0:0的文件,
  内容样例为:

  DEVICE=”eth0:0″
  IPADDR=”192.168.0.2″
  BROADCAST=”172.168.0.255″
  NETMASK=”255.255.255.0″
  ONBOOT=”yes”
  其中的DEVICE为设备的名称,
  IPADDR为此设备的IP地址,
  BROADCAST是广播地址,
  NETMASK为子网掩码,
  ONBOOT 表示在系统启动时自动启动。
  如果需要再绑定多一个IP地址,
  只需要把文件名和文件内的DEVICE中的eth0:x加一即可。
  LINUX最多可以支持255个IP别名
  
2、普遍适用的单网卡绑定多IP实现方法

  ifconfig eth0:1 192.168.0.3 broadcast 192.168.0.255 netmask 255.255.255.0
  可以把上述命令加在启动自运行文件里面,在Gentoo下是/etc/conf.d/local.start,而某些版本的Linux是/etc/rc.d/rc.local。
  
3、多网卡共用单IP的实现方法
  使用多块网卡虚拟成为一块网卡,具有相同的IP地址。这项技术其实在sun和cisco中已经存在,分别称为Trunking和 etherchannel技术,在linux中,这种技术称为bonding。因为bonding在内核2.4.x中已经包含了,只需要在编译的时候把网络设备选项中的 Bonding driver support选中就可以了。
  然后,重新编译核心,重新起动计算机,执行如下命令:
  ismod bonding
  ifconfig eth0 down
  ifconfig eth1 down
  ifconfig bond0 ipaddress
  ifenslave bond0 eth0
  ifenslave bond0 eth1
  现在两块网卡已经象一块一样工作了,这样可以提高集群节点间的数据传输。
  你最好把这几句写成一个脚本,再由/etc/rc.d/rc.local或者/etc/conf.d/local.start调用,以便一开机就生效。
  bonding对于服务器来是个比较好的选择,在没有千兆网卡时,用两三块100兆网卡作 bonding,可大大提高服务器到交换机之间的带宽。但是需要在交换机上设置连接bonding 网卡的两个口子映射为同一个虚拟接口。

近日在进行Aapche的虚拟站点设置时,因为想使用单网卡上绑定多个IP,通过研究发现,SUSUE 10与RED HAT有所不同,在SUSE10中并没有/etc/sysconfig/network-scripts目录,所以只能另辟方法.

SUSE 10中设定单网卡绑定多个IP需要在配置文件/etc/sysconfig/network/ifcfg-eth-id-xx.xx.xx.xx.xx的配置文件中添加如下几行:

IPADDR_1=’192.168.2.151′
NETMASK_1=’255.255.255.0′
LABEL_1=’1′
IPADDR_2=’192.168.2.152′
NETMASK_2=’255.255.255.0′
LABEL_2=’2′
IPADDR_3=’192.168.2.153′
NETMASK_3=’255.255.255.0′
LABEL_3=’3′
注意:

IPADDR_X 指定所需要的IP地址

NETMASK_X 指定对应IP地址的子网掩码

LABEL_X 指定该网卡的别名,如此处的数字1、2、3,对应通过ifconfig命令查看到的名称为:eth0:1、eth0:2、eth0:3

通过以上的设置,我们就在单网卡上绑定了四个IP地址

linux网卡配置文件

联网其实就3个步骤
1.配ip
2.配dns
3.指定gateway
——————————————————————————————–
主机IP
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=
NM_CONTROLLED=yes
ONBOOT=yes
BOOTPROTO=static
TYPE=Ethernet
USERCTL=NO #设置root以外的人是否可以控制eth0网卡
IPADDR=192.168.168.168
NETMASK=255.255.255.0
NETWORK=192.168.168.0 #设置IP地址段

网络DNS
/etc/resolv.conf
nameserver 192.168.168.1 #指定dns

主机网络
/etc/sysconfig/network
NETWORK=yes #网络是否可以被配置,设为No将不能配置网络,service network restart无效
HOSTNAME=localhost.localdomain
GATWAYEV=eth0 #设置属于eth0网卡
GATEWAY=192.168.168.1 #设置默认网关,很重要
RORWARD_IPV4=YES #是否开启ip地址转发功能
这一步可以用命令代替:route add default gw 192.168.168.1
——————————————————————————————–
/etc/networks
暂时我也不是很明白,说是表示网络名之类的,网络编号,没用过
——————————————————————————————–
host.conf配置文件一般不用
/etc/host.conf
multi on #指定主机是否可以有多个ip地址
order bind,hosts #指定解析顺序
——————————————————————————————–
本地解析文件
/etc/hosts
#格式:
IP 主机域名 主机别名
127.0.0.1 www.baidu.com baidu
——————————————————————————————–

帝国tag链接显示为ID连接方式

在使用帝国CMS的过程中,发现启用tag后,连接的地址中有中文,随即想到用tagid来作为访问地址,避免中文对收录的影响。

使用情况为设置cid为selfinfo的情况下,如果设定了cid,此方法无效。

即[showtags]'selfinfo',10,10,'tagid desc',0,'','   ',0,''[/showtags]

1、修改e\class\t_functions.php文件中sys_eShowTags函数

//显示TAGS
function sys_eShowTags($cid,$num=0,$line=0,$order='',$isgood='',$isgoodshow='',$showjg='',$shownum=0,$cs=''){
	global $empire,$dbtbpre,$public_r,$navinfor;
	$str='';
	if(empty($showjg))
	{
		$showjg='   ';
	}
	$ln=0;
	if($cid=='selfinfo')
	{
		if(empty($navinfor['infotags']))
		{
			return '';
		}
		$jg='';
		$r=explode(',',$navinfor['infotags']);		
		$count=count($r);	
		for($i=0;$i<$count;$i++)
		{
		$sql=$empire->query("select tagid from {$dbtbpre}enewstags where tagname='".$r[$i]."'");
		$rtagid=$empire->fetch($sql);
			$ln++;
			$br='';
			if($line)
			{
				if($ln%$line==0)
				{
					$br='
'; } } $str.=$jg.''.$r[$i].''.$br; //$str.=$jg.''.$r[$i].''.$br; $jg=$br?'':$showjg; } } else { $and=''; $where=''; if($cid) { $where=strstr($cid,',')?"cid in ($cid)":"cid='$cid'"; $and=' and '; } if($isgood) { $where.=$and.'isgood=1'; } if($where) { $where=' where '.$where; } $order=$order?' '.$order:' tagid desc'; $limit=''; if($num) { $limit=' limit '.$num; } //推荐标红 $gfont1=''; $gfont2=''; if($isgoodshow) { if(strstr($isgoodshow,'r')) { $gfont1=''; $gfont2=''; } if(strstr($isgoodshow,'s')) { $gfont1=$gfont1.''; $gfont2=''.$gfont2; } } $jg=''; $snum=''; $sql=$empire->query("select tagid,tagname,num,isgood from {$dbtbpre}enewstags".$where." order by".$order.$limit); while($r=$empire->fetch($sql)) { if($shownum) { $snum='('.$r[num].')'; } $font1=''; $font2=''; if($isgoodshow&&$r[isgood]) { $font1=$gfont1; $font2=$gfont2; } $ln++; $br=''; if($line) { if($ln%$line==0) { $br='
'; } } $str.=$jg.''.$font1.$r[tagname].$snum.$font2.''.$br; $jg=$br?'':$showjg; } } echo $str; }

其实其中加入了三句代码,也可自行修改。

$sql=$empire->query("select tagid from {$dbtbpre}enewstags where tagname='".$r[$i]."'");
$rtagid=$empire->fetch($sql);

$str.=$jg.''.$r[$i].''.$br;

2、加入伪静态规则。
nginx下伪静态为

rewrite "^/tags\/([0-9]+)\.html$" /e/tags/?tagid=$1 last;

完成后又发现tag列表项过多时,会有导航栏,导航栏内的链接为动态形式,需要修改,方法如下。
1、修改e/tag/index.php
172行

$listpage=page1($num,$line,$page_line,$start,$page,$search);

改成

$listpage=pagetag($num,$line,$page_line,$start,$page,$tagid);

2、修改e/class/connect.php
复制一份函数function page1(),命名为function pagetag()
修改
function pagetag()函数如下

//TAGS分页
function pagetag($num,$line,$page_line,$start,$page,$tagid){
	global $fun_r;
	if($num<=$line)
	{
		return '';
	}
	$tagid='_'.$tagid;
	$url='index';
	$snum=2;//最小页数
	$totalpage=ceil($num/$line);//取得总页数
	$firststr=' '.$num.'   ';
	//上一页
	if($page<>0)
	{
		$toppage=''.$fun_r['startpage'].' ';
		$pagepr=$page-1;
		$prepage=''.$fun_r['pripage'].'';
	}
	//下一页
	if($page!=$totalpage-1)
	{
		$pagenex=$page+1;
		$nextpage=' '.$fun_r['nextpage'].'';
		$lastpage=' '.$fun_r['lastpage'].'';
	}
	$starti=$page-$snum<0?0:$page-$snum;
	$no=0;
	for($i=$starti;$i<$totalpage&&$no<$page_line;$i++)
	{
		$no++;
		if($page==$i)
		{
			$is_1="";
			$is_2="";
		}
		else
		{
			$is_1='';
			$is_2="";
		}
		$pagenum=$i+1;
		$returnstr.=" ".$is_1.$pagenum.$is_2;
	}
	$returnstr=$firststr.$toppage.$prepage.$returnstr.$nextpage.$lastpage;
	return $returnstr;
}

3、nginx伪静态规则

rewrite "^/tags\/index\_([0-9]+)\_([0-9]+)\.html$" /e/tags/index.php?page=$2&tagid=$1&line=25&tempid=1 last;

备注:本来想采用输出的内容$returnstr,用正则替换的方法改变链接方式,结果发现无效果,屡试不成功,就放弃了,代码如下。

e/class/connect.php的pagetag函数中,最后一部分改成

$returnstr=$firststr.$toppage.$prepage.$returnstr.$nextpage.$lastpage;
$aaaaa='/e\/tags\/index\.php\?page\=([0-9]+)\&tagid\=([0-9]+)\&line\=25\&tempid\=1/';
$bbbbb='/tags/index_$2_$1.html';
$returnstr=preg_replace($aaaaa,$bbbbb,$returnstr);
return $returnstr;
实现转换成的模式为
tags/index_tagid_page.html
原连接模式为
/e/tags/index.php?page=1&tagid=2&line=25&tempid=1
转换伪静态
rewrite "^/tags\/index\_([0-9]+)\_([0-9]+)\.html$" /e/tags/index.php?page=$2&tagid=$1&line=25&tempid=1 last;

修改帝国文章路径为目录加ID

帝国6.5更改了内容页目录存放形式.如何更改旧文章生成路径?

可以用代码直接改数据库,论坛里找到了一段:

update phome_ecms_表 set newspath=''

但这个的形式是直接将路径改为:目录/ID.html

帝国官方sitemap插件伪静态

其实发现帝国cms还是有些很不人性化的地方,比如tag和sitemap,这种大众的功能不能够做好一点点么?帝国的插件社区应该壮大一点才是啊,这么好的cms应该有很多人推动才是。

回归正题,想修改成的格式为
主页产生格式sitemap.xml
栏目产生格式sitemap1.xml

首先在官方插件的sitemap.php中修改了输出格式。
具体的是把

sitemap.php?classid=

修改为

sitemap.xml

相应的nginx伪静态如下

rewrite "^/sitemap\.xml$" /sitemap.php last;
rewrite "^/sitemap([0-9])\.xml$" /sitemap.php?classid=$1 last;

这里提供修改好的官方sitemap.php下载

帝国官方sitemap插件moper修改版
帝国官方sitemap插件

使用方法
1、将sitemap.php文件上传到帝国安装根目录中
2、在robots.txt文件中加入下面这行:
sitemap: http://你的域名/sitemap.xml

这就是景安的办公室

星期天的时候没事儿,去景安转了一圈,没开门,在外面拍了几张哈,这就是传说中景安的办公室了。









CNAME值的DNS挟持问题

如果BIND的zone里有a.com和b.com两个域,BIND是a.com的权威服务器,但不是b.com的。用户设置www.a.com这个记录CNAME到www.b.com。在客户端查询www.a.com时,BIND会返回www.a.com和www.b.com的权威应答,显然www.b.com是DNS挟持。那么客户端如何应对?

这个问题我在BIND邮件列表里询问如下:

If BIND is authoritative for zone a, and is not authoritative for zone b, but zone b is configured in BIND’s zone file, and x.zonea.com is CNAME’d to y.zoneb.com.

When DNS client queries to this BIND for x.zonea.com, it gets the authoritative answers for both x.zonea.com and y.zoneb.com, certainly y.zoneb.com is a fake one.

How DNS client handle this case?

来自ISC的Mark回答如下:

It depends on the client and whether the zones are signed or not
and whether the client is validating responses or not.

Stub clients will almost always trust the complete answer.
For iterative clients it depends on their level of paranoia.

named is paranoid. It discards the rest of the response after processing
the CNAME.

如果客户端解析器是BIND,它在处理CNAME时,简单的丢弃掉CNAME值的剩余部分,重新解析CNAME的目的值,从而避免上述问题。

转自http://www.nsbeta.info/archives/294