如何在apache下实现404重定向

当用户拼错的URL、不存在的URL重定向到别的网页,例如网站的首页、404页面等。如何在apache下实现这些页面的重定向呢,我们可以在httpd.conf或.htaccess文件中使用ErrorDocument来捕获404 (找不到文件)错误:
ErrorDocument 404 /index.html
DirectoryIndex index.html /path/to/notfound.html
这样每次当某人请求无效的URL 时,都返回URL / index.html 提供的网站首页。
这里需要注意两点:
1、直接指向首页是否是合适的?或者让它指向到一个404页面会更好些?如果在404页面用javasctrip做一个跳转到首页,也是SEO允许的做法。
2、即使返回有效的文件,仍然会将404 状态码返回给客户端和搜索引擎。这表示搜索引擎机器人来确认网站上的链接时,仍然会得到正确的结果(404状态码)。


如何实现apache的rewrite伪静态

首先确定您使用的 Apache版本,及是否加载了mod_rewrite模块。
Apache1.x的用户请检查conf/httpd.conf中是否存在如下两段代码:
LoadModule rewrite_module libexec/mod_rewrite.so

AddModule mod_rewrite.c

Apache 2.x 的用户请检查 conf/httpd.conf 中是否存在如下一段代码:

LoadModule rewrite_module modules/mod_rewrite.so

如果存在,那么在配置文件(通常就是 conf/httpd.conf)中加入如下代码。此时请务必注意,如果网站使用通过虚拟主机来定义,请务必加到虚拟主机配置,即 <VirtualHost> 中去,如果加在虚拟主机配置外部将可能无法使用。改好后然后将 Apache 重启。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)/archiver/((fid|tid)-[\w\-]+\.html)$ $1/archiver/index.php?$2
RewriteRule ^(.*)/forum-([0-9]+)-([0-9]+)\.html$ $1/forumdisplay.php?fid=$2&page=$3
RewriteRule ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/viewthread.php?tid=$2&extra=page\%3D$4&page=$3
RewriteRule ^(.*)/space-(username|uid)-(.+)\.html$ $1/space.php?$2=$3
RewriteRule ^(.*)/tag-(.+)\.html$ $1/tag.php?name=$2
</IfModule>

如果没有安装 mod_rewrite,您可以重新编译 Apache,并在原有configure的内容中加入–enable-rewrite=shared,然后再在 Apache 配置文件中加入上述代码即可。


linux下解决apache虚拟主机的Could not resolve host name错误

在LINUX下APACHE的虚拟主机的配置是个技术活儿,很多小的细节需要顾虑
当你的域名没有绑定好的时候,就会出现以下这个错误
Could not resolve host name
在您Apache服务器的配置中创建一个虚拟主 机并不会自动在您的DNS中对主机名做相应更新。您必须自己在DNS中添加域名来指向您的IP地址。否则别人是无法看到您的web 站点的。您可以在您的hosts文件中添加这一条目来进行测试,但这种方法仅适用于那些有这些条目的机器来使用。
# Ensure that Apache listens on port 80
Listen 80
# Listen for virtual host requests on all IP addresses
NameVirtualHost *
<VirtualHost *>
DocumentRoot /www/example1
ServerName www.example1.com
# Other directives here
</VirtualHost>
<VirtualHost *>
DocumentRoot /www/example2
ServerName www.example2.org
# Other directives here
</VirtualHost>
因为星号匹配所有的地址,所以主服务器不接收任何请求。因为 www.example1.com首先出现在配置文件中,所以它拥有最高 优先级,可以认为是默认或首要服务器。这意 味着如果一个接受的请求不能与某个ServerName指令相匹配, 它将会由第一个VirtualHost所伺服。
您可以用确定的IP地址来取代*。 在这种情况下,VirtualHost的参数必须 与NameVirtualHost的参数相符:
NameVirtualHost 172.20.30.40
<VirtualHost 172.20.30.40>
# etc …
不论如何,当您的IP地址无法确定的时候,使用* 是很方便的——比如说,您的ISP给您配置的是动态IP地址,而您有 使用了某种动态域名解析系统时。因为*匹配任何IP 地址,所以在这样的情况下,不论IP地址如何变化,您都不需要另 外进行配置。
上述配置就是您在绝大多数情况下使用基于域名的虚拟主机时将要用到 的。事实上,仅在一种情况下这样的配置不会让您满意:当您想为不同的IP 地址或是端口提供不同的内容时。


You don’t have permission to access

刚刚配置了新服务器,目录也设置好了,但访问的时候显示403错误
You don’t have permission to access
看来是权限的问题,赶忙去看APACHE的配置文件
在httpd.conf,找到这么一段:
Options FollowSymLinks
AllowOverride None
Order deny,allow
deny from all
Satisfy all
然后试着把deny from all中的deny改成了allow,保存后重起了apache,问题解决


怎么设置Apache301永久重定向

网站有4个域名,搜索引擎里面的权值都不一样,而且还区分有无WWW的,很乱套,推出一个主域名势在必行。这里以本域名举例说明问题。本来以为要在Apache里面配置这几个域名均为虚拟主机配置,在几个非主域名的目录里面只设置一个DOThtaccess文件:RewriteRule ^/(.*)$ http://www.murray.cn/$1 [R=301,L]

最麻烦的就是所有域名空间都要配置成虚拟主机,按主机名而不是IP来访问网站,真怕正在运行的服务器崩溃了。。汗啊。。
没想到最终解决方案这么简单:

RewriteCond %{http_host} !^www.murray.cn [NC]
RewriteRule ^/(.*)$ http://www.murray.cn/$1 [R=301,NC,L]

关键的是这个叹号和最后的这个L。叹号表示非,L表示最终结果,不再循环。
NC是不区分大小写。
另外对个别页面:首页做301转向,这个据说也对SEO非常有利:

RewriteCond %{http_host} ^www.murray.cn [NC]
RewriteRule ^/index http://www.murray.cn/ [R=301,NC]

因为这个/index的PR比较高。
另外研究了两个条件的写法:

RewriteCond %{http_host} !^127.0.0.1 [NC]
RewriteCond %{http_host} !^www.murray.cn [NC]
RewriteRule ^/(.*)$ http://www.murray.cn/$1 [R=301,NC,L]

这种是AND的写法

RewriteCond %{http_host} !^127.0.0.1 [NC,OR]
RewriteCond %{http_host} !^www.murray.cn [NC]
RewriteRule ^/(.*)$ http://www.murray.cn/$1 [R=301,NC,L]

这是OR的写法
总的来说,Apache太灵活了


开源搜索引擎工具包

1.Lucene
Lucene是目前最为流行的开放源代码全文搜索引擎工具包,隶属于Apache基金会,由资深全文索引/检索专家Doug Cutting所发起,并以其妻子的中间名作为项目的名称。Lucene不是一个具有完整特征的搜索应用程序,而是一个专注于文本索引和搜索的工具包,能够为应用程序添加索引与搜索能力。基于Lucene在索引及搜索方面的优秀表现,虽然由Java编写的Lucene具有天生的跨平台性,但仍被改编为许多其他语言的版本:Perl、Python、C++、.Net等。
同其他开源项目一样,Lucene具有非常好的架构,能够方便地在其基础上进行研究与开发,添加新功能或者开发新系统。Lucene本身只支持文本文件及少量语种的索引,并且不具备爬虫功能,而这正是Lucene的魅力所在,通过Lucene提供的丰富接口,我们可以根据自身的需要在其上添加具体语言的分词器,针对具体文档的文本解析器等,而这些具体的功能实现都可以借助于一些已有的相关开源软件项目、甚至是商业软件来完成,这也保证了Lucene在索引及搜索方面的专注性。目前,通过在Lucene的基础上加入爬行器、文本解析器等也形成了一些新的开源项目,如LIUS、Nutch等。并且Lucene的索引数据结构已经成了一种事实上的标准,为许多搜索引擎所采用。
2.LIUS
LIUS即Lucene Index Update and Search的缩写,它是以Lucene为基础发展起来的一种文本索引框架,和Lucene一样,同样可以看作搜索引擎开发工具包。它在Lucene的基础上作了一些相应的研究及添加了一些新的功能。LIUS借助于许多开源软件,可以直接对各种不同格式/类型的文档进行文本解析与索引,这些文档格式包括MS Word、MS Excel、MS PowerPoing、RTF、PDF、XML、HTML、TXT、Open Office及JavaBeans等,对Java Beans的支持对于进行数据库索引非常有用,在用户进行对象关系映射(如:Hibernate、JDO、TopLink、Torque等)的数据库连接编程时会变得更加精确。LIUS还在Lucene的基础上增加了索引更新功能,使针对索引的维护功能进一步完善。并且支持混和索引,可以把同一目录下与某一条件相关的所有内容整合到一起,这种功能对于需要对多种不同格式的文档同时进行索引时非常有用。
3.Egothor
Egothor是一款开源的高性能全文搜索引擎,适用于基于全文搜索功能的搜索应用,它具有与Luccene类似的核心算法,这个项目已经存在了很多年,并且拥有一些积极的开发人员及用户团体。项目发起者Leo Galambos是捷克布拉格查理大学数学与物理学院的一名高级助理教授,他在博士研究生期间发起了此项目。
更多的时候,我们把Egothor看作一个用于全文搜索引擎的Java库,能够为具体的应用程序添加全文搜索功能。它提供了扩展的Boolean模块,使得它能被作为Boolean模块或者Vector模块使用,并且Egothor具有一些其他搜索引擎所不具有的特有功能:它采用新的动态算法以有效提高索引更新的速度,并且支持平行的查询方式,可有效提高查询效率。在Egothor的发行版中,加入了爬行器、文本解析器等许多增强易用性的应用程序,融入了Golomb、Elias-Gamma等多种高效的压缩方法,支持多种常用文档格式的文本解析,如HTML、PDF、PS、微软Office文档、XLS等,提供了GUI的索引界面及基于Applet或者Web的查询方式。另外,Egothor还能被方便地配置成独立的搜索引擎、元数据搜索器、点对点的HUB等多种且体的应用系统。
4.Xapian
Xapian是基于GPL发布的搜索引擎开发库,它采用C++语言编写,通过其提供绑定程序包可以使Perl、Python、PHP、Java、Tck、C#、Ruby等语言方便地使用它。
Xapian还是一个具有高适应性的工具集,使开发人员能够方便地为他们的应用程序添加高级索引及搜索功能。它支持信息检索的概率模型及丰富的布尔查询操作。Xapian的发布包通常由两部分组成:xapian-core及xapian-bindings,前者是核心主程序,后者是与其他语言进行绑定的程序包。
Xapian为程序开发者提供了丰富的API及文档进行程序的编制,而且还提供了许多编程实例及一个基于Xapian的应用程序Omega,Omega由索引器及基于CGI的前端搜索组成,能够为HTML、PHP、PDF、PostScript、OpenOffice/StarOffice、RTF等多种格式的文档编制索引,通过使用Perl DBI模块甚至能为MySQL、PostgreSQL、SQLite、Sybase、MS SQL、LDAP、ODBC等关系数据库编制索引,并能以CSV或XML格式从前端导出搜索结果,程序开发者可以在此基础上进行扩展。
5.Compass
Compass是在Lucene上实现的开源搜索引擎架构,相对比于Lucene而言,提供更加简洁的搜索引擎API。增加了索引事务处理的支持,使其能够更方便地与数据库等事务处理应用进行整合。它更新时无需删除原文档,更加简单更加高效。资源与搜索引擎之间采用映射机制,此种机制使得那些已经使用了Lucene或者不支持对象及XML的应用程序迁移到Compass上进行开发变得非常容易。
Compass还能与Hibernate、Spring等架构进行集成,因此如果想在Hibernate、Spring项目中加入搜索引擎功能,Compass是个极好的选择。


如何让Apache与IIS共用80端口

方法一:
网上常用的单IP共用80端口方法,不过不推荐,只是使用Apache的代理,速度有影响将apache设为使用80端口,IIS使用其它端口,比如81,然后将apache作为IIS的代理。
在httpd.conf里面,取消下面四行的注释:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
然后建立一个虚拟主机,将该域名的所有访问转向81端口。
ServerName iloves.vicp.net
ProxyPass / http://localhost:81/
ProxyPassReverse / http://localhost:81/
这样,对外就可以只需要一个端口,即可同时使用apache和IIS的功能了
类推,使用第二种方法,你可以在IIS上配置PHP4,Apache2中配置PHP5,只需要IIS中安装PHP4,把php.ini复制到\windows目录即可,这个就不用说了吧,Apache2中,只要把PHP5的php.ini放在PHP5安装目录里面就行了
方法二:
IIS6,多IP下共存,IIS为192.168.0.1,apache为192.168.0.2
到2003的CD下的 support/tools/Support.cab。解压出httpcfg.exe文件,COPY到windows/system32/目录下,用法自己看帮助
命令行
绑定到某IP:?httpcfg set iplisten -i 192.168.0.1
即命令使用IIS的只监听指定的IP及端口
查看绑定:?httpcfg query iplisten?
删除绑定:?httpcfg delete iplisten -i 192.168.0.1
命令行
net stop Apache2
net stop iisadmin /y
net START Apache2
net START w3svc
保证iis下的ip设置为全局默认,Apache中httpconf设置listen 192.168.0.2:80,就应该可以两个服务同时运行,相互不冲突了。
IIS的访问地址为http://192.168.0.1,Apache访问地址为http://192.168.0.2
配置Apache以支持PHP5:
LoadModule php5_module “D:/PHPServer/PHP5/php5apache2.dll”
AddType application/x-httpd-php .php
DirectoryIndex index.html index.php
PHPIniDir “D:/PHPServer/PHP5″
其中最重要的一条就是 PHPIniDir,用来指明php.ini文件所在位置,即PHP5的安装目录,注意所有目录的应该改为D:/PHPServer/PHP5这种格式,而非D:\PHPServer\PHP5,IIS的访问地址为http://192.168.0.1,Apache访问地址为http: //192.168.0.2


打造安全的Apache服务器

一、Apache 服务器的功能
  
Apache Serve的前身是NCSA的httpd,曾经在1995年成为最为流行的万维网的服务器。因为强大的功能和灵活的设置及平台移植性,Apache Server取得了广泛的信赖。Apache Server的主要功能有:
1、支持最新的HTTP1.1协议(RFC2616)。
2、极强的可配置和可扩展性,充分利用第三方模快的功能。
3、提供全部的源代码和不受限制的使用许可(License)。
4、广泛应用于Windows 2000/NT/9x、Netware 5.x,OS/2 和UNIX家族极其他操作系统,所支持的平台多达17余种。
5、强大的功能,涵盖了用户的需求,包括:认证中的DBM数据库支持;错误和问题的可定制响应的目录导向功能;不受限的灵活的URL别名机制和重定向功能;虚拟主机(多宿主主机)支持多个域主页共存一台主机;超强的日志文件功能;利用站点的分析;拓展于维护等等。
正因为这些强大的优势,使Apache Server与其他的Web服务器相比,充分展示了高效、稳定及功能丰富的特点。Apache Server 已用于超过600万个Internet站点。
二、Apache 服务器的安全特性
作为最流行的Web服务器,Apache Server提供了较好的安全特性,使其能够应对可能的安全威胁和信息泄漏。
1、采用选择性访问控制和强制性访问控制的安全策略
从Apache 或Web的角度来讲,选择性访问控制DAC(Discretionary Access Control)仍是基于用户名和密码的,强制性访问控制MAC(Mandatory Access Control)则是依据发出请求的客户端的IP地址或所在的域号来进行界定的。对于DAC方式,如输入错误,那么用户还有机会更正,从新输入正确的的密码;如果用户通过不了MAC关卡,那么用户将被禁止做进一步的操作,除非服务器作出安全策略调整,否则用户的任何努力都将无济于事。
2、Apache 的安全模块
Apache 的一个优势便是其灵活的模块结构,其设计思想也是围绕模块(Modules)概念而展开的。安全模块是Apache Server中的极其重要的组成部分。这些安全模块负责提供Apache Server的访问控制和认证、授权等一系列至关重要的安全服务。
mod_access模块能够根据访问者的IP地址(或域名,主机名等)来控制对Apache服务器的访问,称之为基于主机的访问控制。
mod_auth模块用来控制用户和组的认证授权(Authentication)。用户名和口令存于纯文本文件中。mod_auth_db和mod_auth_dbm模块则分别将用户信息(如名称、组属和口令等)存于Berkeley-DB及DBM型的小型数据库中,便于管理及提高应用效率。
mod_auth_digest模块则采用MD5数字签名的方式来进行用户的认证,但它相应的需要客户端的支持。
mod_auth_anon模块的功能和mod_auth的功能类似,只是它允许匿名登录,将用户输入的E-mail地址作为口令。
SSL(Secure Socket Lager),被Apache所支持的安全套接字层协议,提供Internet上安全交易服务,如电子商务中的一项安全措施。通过对通讯字节流的加密来防止敏感信息的泄漏。但是,Apache的这种支持是建立在对Apache的API扩展来实现的,相当于一个外部模块,通过与第三方程序的结合提供安全的网上交易支持。


图片防盗链的实现

我们可以用mod_rewrite来实现Apache实现图片防盗链以及显示一张“禁止盗链”的图片。
假设充许连结图片的主机域名为:www.youtianxia.net
修改httpd.conf
SetEnvIfNoCase Referer “^http://www.youtianxia.net/” local_ref=1
<FilesMatch “.(gif|jpg)”>
Order Allow,Deny
Allow from env=local_ref
</FilesMatch>
这个简单的应用不光可以解决图片盗链的问题,稍加修改还可以防止任意文件盗链下载的问题。
使用以上的方法当从非指定的主机连结图片时,图片将无法显示。
如果希望显示一张“禁止盗链”的图片,我们可以用mod_rewrite 来实现。
首先在安装 apache 时要加上 –enable-rewrite 参数加载 mod_rewrite 模组。
假设“禁止盗链”的图片为abc.gif,我们在 httpd.conf 中可以这样配置:
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?demo.com.cn /.*$ [NC]
RewriteRule \.(gif|jpg)$ http://www.phpq.net/abc.gif [R,L]
DocumentRoot “/usr/local/apache/htdocs”
#设置存放站点html文件的目录。
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
#设置/目录的指令。具体地说明:
Option:定义在目录内所能执行的操作。
None:表示只能浏览,
FollowSymLinks:允许页面连接到别处,
ExecCGI:允许执行CGI,
MultiViews:允许看动画或是听音乐之类的操作,
Indexes:允许服务器返回目录的格式化列表,
Includes:允许使用SSI。这些设置可以复选。
All:则可以做任何事,但不包括MultiViews。
AllowOverride:加None参数表示任何人都可以浏览该目录下的文件。
另外的参数有:FileInfo、AuthConfig、Limit。


用gzip压缩Web文件,为网页提速

通过gzip压缩文件,用以提高web站点的性能,提高网页访问速度。如何开始对网站内容进行gzip,如果根据不同的主机环境来对这个做相应设置准备,环境假设为LAMP
选择1: 对Apache 1.x进行mod_gzip操作
如果你使用Apache 1.2 和1.3,那么mod_gzip 模块是可用的。为了检查Apache的版本,你可以检查Firebug’中Net面板,查找对于任何请求,服务器响应的头部。如果你不能看到它,那么检查提供商的文档或者创建一个简单的PHP脚本来回显这些信息到浏览器中去,如:
<?php echo apache_get_version(); ?>
在服务器头部信息中,你或许能看到mod_gzip版本,如果它被安装了的话。它或许是这个样子的:
Server: Apache/1.3.37 (Unix) mod_gzip/1.3.26.1a…..
好了,在我们将信息发送给浏览器之前,我们已经建立了我想要压缩的所有内容,PHP脚本输出,静态HTML页面,JavaScripts和样式表。那么现在就可以通过mod_gzip来实现,在你站点的根目录下创建一个.htaccess文件,包括:
mod_gzip_on Yes
mod_gzip_item_include mime ^application/x-javascript$
mod_gzip_item_include mime ^application/json$
mod_gzip_item_include mime ^text/.*$
mod_gzip_item_include file \.html$
mod_gzip_item_include file \.php$
mod_gzip_item_include file \.js$
mod_gzip_item_include file \.css$
mod_gzip_item_include file \.txt$
mod_gzip_item_include file \.xml$
mod_gzip_item_include file \.json$
Header append Vary Accept-Encoding
第一行是的mod_gzip命令可用。下面的三行设置压缩是基于MIME类型上的。下面的部分是一样,只是以文件扩展为基础。最后的一行是设置Vary头部的,包括Accept-Encoding值。
如果你想发送Vary: *头部,使用:
Header set Vary *
需要注意的是,一些主机提供商不允许你使用Header 定向。如果存在这种情况,希望你可以用下面这句话来代替最后一行“
mod_gzip_send_vary On
这也将要设置Vary头部为Accept-Encoding.
需要注意的是,这里或许有很小的文件存在,如果你的文件太小(举个例子,小于1KB),那么它们就需要gzip,即时你已经将所有的东西都设置正确了。如果你gzip的话,你的主机不得不为每个小的文件进行不必要的gzip开销。
选择2:Apache 2.0版本使用mod_deflate
如果你的主机运行的是Apache 2版本,那么你可以使用mod_deflate。尽管的它的名字没有带有gzip的信息,但是它也是使用gzip进行压缩。为了设置mod_deflate,需要在.htaccess文件中添加下面的信息:
AddOutputFilterByType DEFLATE text/html text/css text/plain text/xml application/x-javascript application/json
Header append Vary Accept-Encoding
选择3:使用php.ini文件
理想情况下,我们希望Apache能gzip内容,但是不幸的是,一些主机提供商或许不允许你这么做。如果你的主机提供商这这样的话,你就可以使用php.ini文件。若干你将一个php.ini文件放到一个目录下,那么它就会重写这个目录和它子目录下的PHP设置。
如果你不能使用Apache的mod_gzip 或mod_deflate模块,你仍旧能够使用PHP来压缩你的内容,达到预期的解决方案,你需要设置你的web服务器,因此所有的静态HTML、JavaScript [...]