这个博客部署在Linux上,但是Apache不支持中文路径,所以目录与标签都显示不出来。本文转载并完善了Fedora 22上httpd的中文路径配置方法,测试通过。

转自:http://www.oschina.net/question/4873_17137 并进行完善。

我的环境:

  • Fedora 22 (Twenty Two) [running on Android via Linux Deploy]
  • Apache httpd.armv7hl 2.4.12-1.fc22

测试通过.

安装需要的包

	dnf install httpd httpd-devel make gcc patch –y

原文:

Url: http://webdav.todo.gr.jp/

下载包和补丁

下载包

	mkdir -p /root/install/mod/ 
	cd /root/install/mod/ 

	wget http://webdav.todo.gr.jp/download/mod_encoding-20021209.tar.gz 

	wget http://webdav.todo.gr.jp/download/experimental/mod_encoding.c.apache2.20040616 
	tar -xzvf mod_encoding-20021209.tar.gz

用新版本mod_encoding.c,覆盖原来版本

	cp mod_encoding.c.apache2.20040616 mod_encoding-20021209/mod_encoding.c

下载补丁

	wget http://www.aconus.com/~oyaji/faq/mod_encoding.c-apache2.2-20060520.patch 
	cp mod_encoding.c-apache2.2-20060520.patch mod_encoding-20021209/ 

	cd mod_encoding-20021209 

	patch -p0 < mod_encoding.c-apache2.2-20060520.patch 

安装iconv-hook

	cd /root/install/mod/mod_encoding-20021209/lib 

	./configure 
	make 
	make install

完成上面操作后,iconv_hook相关so文件放到/usr/local/lib下面。 要操作系统系统能够搜索到该so文件,需要完成一下几行操作 打开/etc/ld.so.conf文件,添加一行指向iconv_book的所在路径,即”/usr/local/lib”

也可以执行:

	echo  /usr/local/lib >> /etc/ld.so.conf 

	ldconfig

构建mod_encoding

	cd /root/install/mod/mod_encoding-20021209/ 

这里原文是: ./configure --with-apxs=/usr/local/apache2/bin/apxs --with-iconv-hook=/usr/include

这里使用httpd,需要改为:

	./configure --with-apxs=/usr/bin/apxs --with-iconv-hook=/usr/include 

然后执行:

	make 

	gcc -shared -o mod_encoding.so mod_encoding.o -Wc,-Wall -Llib -liconv_hook 

原文是: cp mod_encoding.so /usr/local/apache2/modules

这里要拷贝到: cp mod_encoding.so /usr/lib/httpd/modules

配置 httpd

	vim /etc/httpd/conf/httpd.conf 

添加:

	#—
	LoadModule headers_module modules/mod_headers.so 
	LoadModule encoding_module modules/mod_encoding.so 
	
	<IfModule mod_headers.c> 
	Header add MS-Author-Via "DAV" 
	</IfModule> 
	
	<IfModule mod_encoding.c> 
	EncodingEngine on 
	NormalizeUsername on 
	SetServerEncoding GBK 
	DefaultClientEncoding UTF-8 GBK GB2312 
	AddClientEncoding "(Microsoft .* DAV $)" UTF-8 GBK GB2312 
	AddClientEncoding "Microsoft .* DAV" UTF-8 GBK GB2312 
	AddClientEncoding "Microsoft-WebDAV*" UTF-8 GBK GB2312 
	</IfModule>
	#—

重启测试

	httpd -k restart

测试

http://www.aicookie.com/categories/开发

都可以,

到此配置完毕.

已知问题:

这个问题是mod_encoding已经先一步处理了url ,而PHP又解了一次 例如

	x.php?s=%252B%2F%2B%2F

那么$_GET[’s’]得到的是 +/ /

	urlencode("+") = %2B 
	urlencode("%2B") = %252B

所以,这个url被decode了两次

第一次是

	urldecode( "%252B%2F%2B%2F") = %2B/+/ 
	urldecode( "%2B/+/") = +/ /

解决办法:

修改httpd.conf 将

	<IfModule mod_encoding.c> 
	EncodingEngine on 
	... 
	... 
	</IfModule>

这一段配置移到需要的vitualHost里去,不用设置在全局配置中,这个不能和php脚本并存.