分类目录归档:apache

PHP开发环境搭建


//httpd.conf配置

#START module方式


# 对 PHP 5 用这两行:

#LoadModule php5_module “d:/php5.5/php5.dll”

#AddType application/x-httpd-php .php

# 配置 php.ini 的路径

#PHPIniDir “D:/php5.5”

#END module方式


#START cgi方式

ScriptAlias /php/ “d:/php5.3/”

AddType application/x-httpd-php .php

# 对 PHP 4 用这行

#Action application/x-httpd-php “/php/php.exe”

# 对 PHP 5 用这行

Action application/x-httpd-php “/php/php-cgi.exe”

#END cgi方式


#START fastcgi方式

#ScriptAlias /php/ “d:/php5.5/”

#Action application/x-httpd-php “/php/php-cgi.exe”

#SetEnv PHPRC “d:/php5.5/”

#AddType application/x-httpd-php .php

#LoadModule fastcgi_module modules/mod_fastcgi-2.4.2-AP20.dll

# 说明:此处的 -processes 3 表示启动三个 php-cgi.exe 进程,

# 关于 FastCgiServer 的详细参数请参考 FastCGI 文档。

#FastCgiServer “D:/php5.5/php-cgi.exe” -processes 3

#END cgi方式

<Directory />

    Options FollowSymLinks

    AllowOverride None

    Order deny,allow

    allow from all

</Directory>

//httpd-vhosts.conf

<VirtualHost *:80>

    ServerAdmin [email protected]

    DocumentRoot “D:/apache2.2/htdocs”

    ServerName localhost

    ServerAlias localhost.com

    ErrorLog “logs/dummy-host.localhost-error.log”

    CustomLog “logs/dummy-host.localhost-access.log” common


    <Directory “D:/apache2.2/htdocs”>

    #

    # Possible values for the Options directive are “None”, “All”,

    # or any combination of:

    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews

    #

    # Note that “MultiViews” must be named *explicitly* — “Options All”

    # doesn’t give it to you.

    #

    # The Options directive is both complicated and important.  Please see

    # http://httpd.apache.org/docs/2.2/mod/core.html#options

    # for more information.

    #

    Options Indexes FollowSymLinks


    #

    # AllowOverride controls what directives may be placed in .htaccess files.

    # It can be “All”, “None”, or any combination of the keywords:

    #   Options FileInfo AuthConfig Limit

    #

    AllowOverride All


    #

    # Controls who can get stuff from this server.

    #

    Order allow,deny

    Allow from all


</Directory>

</VirtualHost>

//php.ini配置

extension_dir = “./ext/”

//xdebug配置

;xdebug配置
;载入Xdebug
zend_extension=D:/php5.3/ext/php_xdebug-2.2.6-5.3-vc9-nts.dll
;zend_extension= /usr/lib/php5/20090626+lfs/xdebug.so (Linux)


;debug
;开启远程调试
xdebug.remote_enable=On
;允许连接的zend studio的IP地址
xdebug.remote_host="localhost"
;反向连接zend studio使用的端口
xdebug.remote_port=9000
;用于zend studio远程调试的应用层通信协议
xdebug.remote_handler="dbgp"
;开启远程调试自动启动
xdebug.remote_autostart = Off


;profiler
xdebug.profiler_enable=on
;xdebug 的数据文件目录
xdebug.trace_output_dir="d:/xdebug/"
xdebug.profiler_output_dir="d:/xdebug/"
xdebug.profiler_output_name = "cachegrind.out.%c"


;trace  trace中收集的函数参数
;开启自动跟踪
xdebug.auto_trace = On 
;开启异常跟踪
xdebug.show_exception_trace = On 
;收集变量, 收集参数
xdebug.collect_params = On 
xdebug.collect_vars = On 
xdebug.collect_params = '3'
;收集返回值
xdebug.collect_return = On 
;如果设得太小,函数中有递归调用自身次数太多时会报超过最大嵌套数错
xdebugbug.max_nesting_level = 10000 


;//trace文件格式为html
xdebug.trace_format=2
;//追加trace日志,0:覆盖日志
xdebug.trace_options=1


linux 下 apache启动、停止、重启命令


转自:http://blog.sina.com.cn/s/blog_70ac6bec01018mqs.html


基本的操作方法:

本文假设你的apahce安装目录为/usr/local/apache2,这些方法适合任何情况


apahce启动命令:

推荐/usr/local/apache2/bin/apachectl start apaceh启动


apache停止命令

/usr/local/apache2/bin/apachectl stop   停止


apache重新启动命令:

/usr/local/apache2/bin/apachectl restart 重启


要在重启 Apache 服务器时不中断当前的连接,则应运行:


/usr/local/sbin/apachectl graceful


如果apache安装成为linux的服务的话,可以用以下命令操作:


service httpd start 启动


service httpd restart 重新启动


service httpd stop 停止服务



Linux系统为Ubuntu


一、Start Apache 2 Server /启动apache服务


# /etc/init.d/apache2 start

or

$ sudo /etc/init.d/apache2 start


二、 Restart Apache 2 Server /重启apache服务


# /etc/init.d/apache2 restart

or

$ sudo /etc/init.d/apache2 restart


三、Stop Apache 2 Server /停止apache服务


# /etc/init.d/apache2 stop

or

$ sudo /etc/init.d/apache2 stop


apache虚拟主机



//虚拟主机的配置
也谈apache本地虚拟主机测试环境的搭建

最近的一个系统要求必须在网站根目录下运行,因为生成静态页啥的,URL处理非常繁琐,真正的上线运行就不用担心那么多的问题,那肯定是根目录cool,而我本地的开发环境AMP的根目录下已经遍地狼藉,实在不能再往里头填东西,不然,找文件又得找半天,甚至最大的问题是到时候怎么完整的导出整个网站,不多目录也不少一个文件。唉!~有些愁眉不展。。。咦!强大的apache不是告诉我们可以虚拟主机的吗?我本地搞个不就成了。于是想起小猪写的一篇文章,挖他博客,不难就找到了,照做之,我将本地的域名指定为mydown,我apache的端口是8080,重启apache后,遗憾的事情还是发生了,我输入http://mydown:8080/和http://localhost:8080/指向的同一个站点,这就意味着我原来的资源全部不能访问,哦~
千万不能!继续找资料,查apache手册,总算弄明白怎么整了。
第一步和小猪一样,在C:WINDOWSsystem32driversetchosts的文件中加上一条

127.0.0.1 mydown

然后打开apache的配置文件httpd.conf,翻到最后,加上下面这些

NameVirtualHost *

<VirtualHost *>    
   DocumentRoot D:/myserver/wwwroot
   ServerName localhost:8080
</VirtualHost>

<VirtualHost *>    
   DocumentRoot D:/myserver/wwwroot/mydown
   ServerName mydown:8080
</VirtualHost>

意思就是不同的域名指向不同的目录,重启apache,大功告成~,嘿嘿!今儿就挖了小猪的墙角一回。至于每句的意思,如果您不懂,我还是建议您查查手册了。


如何完成Apache虚拟主机设置?


实现Apache虚拟主机方法一:

开启虚拟主机配置文件


对httpd.conf进行设置:


1.注释以下三行
#ServerAdmin
#ServerName
#DocumentRoot


2.去掉mod_proxy.so和mod_proxy_ajp.so的注释


3.#Virtual hosts

#Include conf/extra/httpd-vhosts.conf (查找这行,把前面的#去掉)
Include /conf/extra/httpd-vhosts.conf


4.打开 /conf/extra/httpd-vhosts.conf

#192.168.1.24为本地Ip
NameVirtualHost 192.168.1.24:80

# php项目

<VirtualHost 192.168.1.24:80>

<Directory “D:/phproot/phpmyadmin”>

DirectoryIndex index.php

</Directory>

ServerAdmin baibiao @gmail.com

ServerName email.sinoepiboly.com

#ServerAlias email.sinoepiboly.com

DocumentRoot D:/phproot/phpmyadmin
ErrorLog “logs/dummy-host-www.nianw-error.log”
CustomLog “logs/dummy-host-www.nianw-access.log” common

</VirtualHost>

其中

Errorlog:是本域名的错误日志

CustomLog:是本域名的访问日志

==================================================================


方法二:

多二级域名主机开发环境设置说明

第一步 DNS解析实现


找到本机的host文件,一般在 C:WINNTsystem32driversetc,在文件结尾添加:


127.0.0.1 localhost

127.0.0.1 www.com.cn

127.0.0.1 home.com.cn

127.0.0.1 mail.com.cn

127.0.0.1 music.com.cn

127.0.0.1 browseusers.com.cn

127.0.0.1 search.com.cn

127.0.0.1 invite.com.cn

127.0.0.1 rank.com.cn

127.0.0.1 blog.com.cn

127.0.0.1 favorites.com.cn

127.0.0.1 forum.com.cn

127.0.0.1 groups.com.cn

127.0.0.1 events.com.cn

127.0.0.1 classifieds.com.cn

127.0.0.1 signup.com.cn

192.168.6.153 i.com.cn

192.168.6.153 x.com.cn


其中

192.168.6.2 i.com.cn

192.168.6.2 x.com.cn

技术人员不作修改,是美工页面专用的


第二步:apache 设置

打开httpd.conf,以music.com.cn为例,其他栏目类似添加,在文件最后加入:

1. 保证
Listen 80

2. 打开注释
NameVirtualHost *:80

3. 在末尾添加
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot “C:/Program Files/Apache Group/Apache2/htdocs/espace/music”
ServerName music.com.cn
</VirtualHost>
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot “C:/Program Files/Apache Group/Apache2/htdocs/espace/blog”
ServerName blog.com.cn
</VirtualHost>

重启即可,Apache虚拟主机设置完成。

URL重写:RewriteCond指令与RewriteRule 指令格式


转自:http://www.sky54.net/?p=932

Rewirte主要的功能就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范。平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等。本文将针对mod_rewrite和URL匹配的技术细节,以及RewriteCond与RewriteRule 指令格式进行探讨。

Rewirte模块内部处理

Rewirte模块的内部处理极为复杂,但是为了使一般用户避免犯低级错误,也让管理员能充分利用其功能,在此仍然做一下说明。

Rewirte模块API阶段

首先,你必须了解Apache是分若干阶段来处理HTTP请求的。Apache API对每个阶段都提供了一个hook程序。mod_rewrite使用两个hook程序:其一,从URL到文件名的转换hook(用在读取HTTP请求之后、授权开始之前); 其二,修正hook(用在授权阶段和读取目录级配置(.htaccess)之后、内容处理器激活之前)。

所以,Apache收到一个请求并且确定了响应主机(或虚拟主机)之后,重写引擎即开始处理服务器级配置中的所有mod_rewrite指令(此时处于从URL到文件名转换的阶段),此阶段完成后,最终的数据目录便确定了。接下来进入修正程序段并触发目录级配置中的mod_rewrite指令。这两个阶段并不是泾渭分明的,但都实施了把URL重写成新的URL或者文件名。虽然API最初不是为此目的而设计的,但是现在它已经成为了API的一种用途。记住以下两点,会有助于更好地理解:

1、虽然mod_rewrite可以将URL重写为新的URL或文件名,甚至将文件名重写为新的文件名,但是之前的API只提供从URL到文件名的hook。在Apache 2.0中,增加了两个丢失的hook以使得处理过程更加清晰。不过这样做并没有给用户带来麻烦,用户只需记住这样一个事实:借助从URL到文件名的hook比最初API设计的目标功能更强大。

2、令人难以置信的是,mod_rewrite还提供了目录级的URL操作(.htaccess文件),而这些文件必须在将URL转换成文件名之后才会被处理(这是必须的,因为.htaccess存在于文件系统中)。换句话说,根据API阶段,这时再处理任何URL操作已经太晚了。为了解决这个”鸡和蛋”的问题,mod_rewrite使用了一个小技巧:在进行一个目录级的URL/文件名操作时,先把文件名重写回相应的URL(通常这个操作是不可行的,但是参考下面的RewriteBase指令就能明白它是怎么实现的了),然后,对这个新的URL建立一个新的内部的子请求,再重新开始API阶段的执行。

另外,mod_rewrite尽力使这些复杂的操作对用户透明。但仍须记住:服务器级的URL操作速度快而且效率高,而目录级的操作由于这个”鸡和蛋”的问题速度较慢而且效率也低。但从另一个侧面看,这却是mod_rewrite得以为一般用户提供(局部限制的)URL操作的唯一方法。

Rewirte模块规则集的处理

当mod_rewrite在这两个API阶段中开始执行时,它会读取配置结构中配置好的 (或者是在服务启动时建立的服务器级的,或者是在遍历目录采集到的目录级的)规则集,然后,启动URL重写引擎来处理(带有一个或多个条件的)规则集。无论是服务器级的还是目录级的规则集,都是由同一个URL重写引擎处理,只是最终结果处理不同而已。

规则集中规则的顺序是很重要的,因为重写引擎是按一种特殊的顺序处理的:逐个遍历每个规则(RewriteRule指令),如果出现一个匹配条件的规则,则可能回头遍历已有的规则条件(RewriteCond指令)。由于历史的原因,条件规则是前置的,所以控制流程略显冗长,细节见图-1。

重写规则集中的控制流

图-1:重写规则集中的控制流

可见,URL首先与每个规则的Pattern匹配,如果匹配失败,mod_rewrite将立即终止此规则的处理,继而处理下一个规则。如果匹配成功,mod_rewrite将寻找相应的规则条件,如果一个条件都没有,则简单地用Substitution构造的新值来替换URL,然后继续处理其他规则;但是如果条件存在,则开始一个内部循环按其列出的顺序逐个处理。对规则条件的处理有所不同:URL并不与模式进行匹配,而是首先通过扩展变量、反向引用、查找映射表等步骤建立一个TestString字符串,然后用它来与CondPattern匹配。如果匹配失败,则整个条件集和对应的规则失败;如果匹配成功,则执行下一个规则直到所有条件执行完毕。如果所有条件得以匹配,则以Substitution替换URL,并且继续处理。(本部分引用译者:金步国)

RewriteCond指令格式

语法: RewriteCond TestString CondPattern [flags]

RewriteCond指令定义一条规则条件。在一条RewriteRule指令前面可能会有一条或多条RewriteCond指令,只有当自身的模板(pattern)匹配成功且这些条件也满足时规则才被应用于当前URL处理。

1、 TestString是一个纯文本的字符串,除了包含普通的字符外,还可以包括下列的可扩展结构:

1)$N:RewriteRule后向引用,其中(0 <= N <= 9) 。$N引用紧跟在RewriteCond后面的RewriteRule中模板中的括号中的模板在当前URL中匹配的数据。

2)%N:RewriteCond后向引用,其中(0 <= N <= 9) 。%N引用最后一个RewriteCond的模板中的括号中的模板在当前URL中匹配的数据。

3)${mapname:key|default}:RewriteMap扩展。

2、CondPattern是条件pattern, 即一个应用于当前实例TestString的正则表达式, 即TestString将会被计算然后与CondPattern匹配。作为一个标准的扩展正则式,CondPattern有以下补充:

1)可以在模板串前增加一个!前缀,以用表示不匹配模板。但并不是所有的test都可以加!前缀。

2)CondPattern中可以使用以下特殊变量:

‘>CondPattern’ (大于) 将condPattern当作一个普通字符串,将它和TestString进行比较,当TestString 的字符大于CondPattern为真。

‘=CondPattern’ (等于) 将condPattern当作一个普通字符串,将它和TestString进行比较,当TestString 与CondPattern完全相同时为真.如果CondPattern只是 “” (两个引号紧挨在一起) 此时需TestString 为空字符串方为真。

‘-d’ (是否为目录) 将testString当作一个目录名,检查它是否存在以及是否是一个目录。

‘-f’ (是否是regular file) 将testString当作一个文件名,检查它是否存在以及是否是一个regular文件。

‘-s’ (是否为长度不为0的regular文件) 将testString当作一个文件名,检查它是否存在以及是否是一个长度大于0的regular文件。

‘-l’ (是否为symbolic link) 将testString当作一个文件名,检查它是否存在以及是否是一个 symbolic link。

‘-F’ (通过subrequest来检查某文件是否可访问) 检查TestString是否是一个合法的文件,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部subrequest完成的, 因此需要小心使用这个功能以降低服务器的性能。

‘-U’ (通过subrequest来检查某个URL是否存在) 检查TestString是否是一个合法的URL,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部subrequest完成的, 因此需要小心使用这个功能以降低服务器的性能。

3、[flags]是第三个参数,多个标志之间用逗号分隔。

1)’nocase|NC’ (不区分大小写)   在扩展后的TestString和CondPattern中,比较时不区分文本的大小写。注意,这个标志对文件系统和subrequest检查没有影响.

2)’ornext|OR’ (建立与下一个条件的或的关系)   默认的情况下,二个条件之间是AND的关系,用这个标志将关系改为OR。例如: RewriteCond %{REMOTE_HOST} ^host1.* [OR] RewriteCond %{REMOTE_HOST} ^host2.* [OR] RewriteCond %{REMOTE_HOST} ^host3.* RewriteRule … 如果没有[OR]标志,需要写三个条件/规则.

RewriteRule 指令

语法: RewriteRule Pattern Substitution [flags]

1) Pattern是一个作用于当前URL的兼容perl的正则表达式. 这里的“当前”是指该规则生效时的URL的值。

2) Substitution是,当原始URL与Pattern相匹配时,用以替代(或替换)的字符串。

3) 此外,Substitution还可以追加特殊标记[flags] 作为RewriteRule指令的第三个参数。 Flags是一个包含以逗号分隔的下列标记的列表:

redirect|R [=code] (强制重定向 redirect)

以 http://thishost[:thisport]/(使新的URL成为一个URI) 为前缀的Substitution可以强制性执行一个外部重定向。 如果code没有指定,则产生一个HTTP响应代码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定这个数值即可, 另外,还可以使用下列符号名称之一: temp (默认的), permanent, seeother. 用它可以把规范化的URL反馈给客户端,如, 重写“/~”为 “/u/”,或对/u/user加上斜杠,等等。

注意: 在使用这个标记时,必须确保该替换字段是一个有效的URL! 否则,它会指向一个无效的位置! 并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/的前缀,重写操作仍然会继续。通常,你会希望停止重写操作而立即重定向,则还需要使用’L’标记.

forbidden|F (强制URL为被禁止的 forbidden)

强制当前URL为被禁止的,即,立即反馈一个HTTP响应代码403(被禁止的)。使用这个标记,可以链接若干RewriteConds以有条件地阻塞某些URL。

gone|G’(强制URL为已废弃的 gone)

强制当前URL为已废弃的,即,立即反馈一个HTTP响应代码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了.

proxy|P (强制为代理 proxy)

此标记使替换成分被内部地强制为代理请求,并立即(即, 重写规则处理立即中断)把处理移交给代理模块。你必须确保此替换串是一个有效的(比如常见的以 http://hostname开头的)能够为Apache代理模块所处理的URI。使用这个标记,可以把某些远程成分映射到本地服务器名称空间, 从而增强了ProxyPass指令的功能。

注意: 要使用这个功能,代理模块必须编译在Apache服务器中。 如果你不能确定,可以检查“httpd -l”的输出中是否有mod_proxy.c。 如果有,则mod_rewrite可以使用这个功能;如果没有,则必须启用mod_proxy并重新编译“httpd”程序。

last|L (最后一个规则 last)

立即停止重写操作,并不再应用其他重写规则。 它对应于Perl中的last命令或C语言中的break命令。这个标记可以阻止当前已被重写的URL为其后继的规则所重写。 举例,使用它可以重写根路径的URL(’/’)为实际存在的URL, 比如, ‘/e/www/’.

next|N (重新执行 next round)

重新执行重写操作(从第一个规则重新开始). 这时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理的URL。它对应于Perl中的next命令或C语言中的continue命令。 此标记可以重新开始重写操作,即, 立即回到循环的头部。

但是要小心,不要制造死循环!

chain|C (与下一个规则相链接 chained)

此标记使当前规则与下一个(其本身又可以与其后继规则相链接的, 并可以如此反复的)规则相链接。 它产生这样一个效果: 如果一个规则被匹配,通常会继续处理其后继规则, 即,这个标记不起作用;如果规则不能被匹配,则其后继的链接的规则会被忽略。比如,在执行一个外部重定向时, 对一个目录级规则集,你可能需要删除“.www” (此处不应该出现“.www”的)。

type|T=MIME-type(强制MIME类型 type)

强制目标文件的MIME类型为MIME-type。 比如,它可以用于模拟mod_alias中的ScriptAlias指令,以内部地强制被映射目录中的所有文件的MIME类型为“application/x-httpd-cgi”。

nosubreq|NS (仅用于不对内部子请求进行处理 no internal sub-request)

在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索可能的目录默认文件(index.xxx)时, Apache会内部地产生子请求。对子请求,它不一定有用的,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除某些规则。

根据你的需要遵循以下原则: 如果你使用了有CGI脚本的URL前缀,以强制它们由CGI脚本处理,而对子请求处理的出错率(或者开销)很高,在这种情况下,可以使用这个标记。

nocase|NC (忽略大小写 no case)

它使Pattern忽略大小写,即, 在Pattern与当前URL匹配时,’A-Z’ 和’a-z’没有区别。

qsappend|QSA (追加请求串 query string append)

此标记强制重写引擎在已有的替换串中追加一个请求串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。

noescape|NE (在输出中不对URI作转义 no URI escaping)

此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(如’%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码。 此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,如:

RewriteRule /foo/(.*) /bar?arg=P1=$1 [R,NE] 可以使’/foo/zed’转向到一个安全的请求’/bar?arg=P1=zed’.

passthrough|PT (移交给下一个处理器 pass through)

此标记强制重写引擎将内部结构request_rec中的uri字段设置为 filename字段的值,它只是一个小修改,使之能对来自其他URI到文件名翻译器的 Alias,ScriptAlias, Redirect 等指令的输出进行后续处理。举一个能说明其含义的例子:如果要通过mod_rewrite的重写引擎重写/abc为/def,然后通过mod_alias使/def转变为/ghi,可以这样:

RewriteRule ^/abc(.*)/def$1[PT]

Alias /def /ghi

如果省略了PT标记,虽然mod_rewrite运作正常, 即, 作为一个使用API的URI到文件名翻译器,它可以重写uri=/abc/…为filename=/def/…,但是,后续的mod_alias在试图作URI到文件名的翻译时,则会失效。

注意: 如果需要混合使用不同的包含URI到文件名翻译器的模块时, 就必须使用这个标记。。混合使用mod_alias和mod_rewrite就是个典型的例子。

For Apache hackers

如果当前Apache API除了URI到文件名hook之外,还有一个文件名到文件名的hook, 就不需要这个标记了! 但是,如果没有这样一个hook,则此标记是唯一的解决方案。 Apache Group讨论过这个问题,并在Apache 2.0 版本中会增加这样一个hook。

skip|S=num (跳过后继的规则 skip)

此标记强制重写引擎跳过当前匹配规则后继的num个规则。 它可以实现一个伪if-then-else的构造: 最后一个规则是then从句,而被跳过的skip=N个规则是else从句. (它和’chain|C’标记是不同的!)

env|E=VAR:VAL (设置环境变量 environment variable)

此标记使环境变量VAR的值为VAL, VAL可以包含可扩展的反向引用的正则表达式$N和%N。 此标记可以多次使用以设置多个变量。这些变量可以在其后许多情况下被间接引用,但通常是在XSSI (via ) or CGI (如 $ENV{’VAR’})中, 也可以在后继的RewriteCond指令的pattern中通过%{ENV:VAR}作引用。使用它可以从URL中剥离并记住一些信息。

cookie|CO=NAME:VAL:domain[:lifetime[:path]] (设置cookie)

它在客户端浏览器上设置一个cookie。 cookie的名称是NAME,其值是VAL。 domain字段是该cookie的域,比如’.apache.org’, 可选的lifetime是cookie生命期的分钟数,可选的path是cookie的路径。

案例:

city_map.txt的内容:

hangzhou 12

beijing 13

1、hangzhou.google.com/tianqi/20090401 跳转到 www.google.com/service/detail.html?id=tianqi&date=20090401

  1. RewriteMapcitymaptxt:/etc/httpd/conf.d/map/city_map.txt
  2.  
  3. RewriteCond %{HTTP_HOST}    ^(.+).google.com$
  4.  
  5. RewriteRule ^/([w]+)/([d]+)$
    /
    service/detail.html?id=$1&date=$2&c=${citymap:%1|%1} [PT,L]

解释:

%{HTTP_HOST}:取请求的域名

^(.+).google.com$:^,开头;$结尾。.(逗号),除终止符外的任意字符。+,重复一个或一个以上的字符。,转义字符。

^/([w]+)/([d]+)$:[],集合字符。w,数字或字母。d,数字。

$1:表示的是符合RewriteRule 中[w]+正则式的字符串,也就是tianqi。

$2:表示的是符合RewriteRule 中[d]+ 正则式的字符串,也就是20090401。

%1:表示的是符合RewriteCond 中.+正则式的字符串,也就是hangzhou。

${city-map:%1|%1}:表示取city-map中%1也就是hangzhou对应的值,如果没有则为%1也就是hangzhou。

2、能看出下面的规则是做了什么吗?

下载:
httpd.ini

  1. RewriteCond     %{HTTP_HOST}    ^(.+).google.com$
  2.  
  3. RewriteRule ^/([w]+)/([^-]+)([^-]+)([^-]+)([^-]+)([^-]+)([^-]+)([^-]+-[^-]+–[^-]+-[^-]+–[^-]+-[^-]+)/$1/$2=$3&$4=$5&$6=$7&$8  [C] 
  4.  
  5. RewriteCond     %{HTTP_HOST}    ^(.+).google.com$
  6.  
  7. RewriteRule ^/([w]+)/([^-]+)([^-]+)([^-]+)([^-]+)([^-]+)([^-]+)
      
    /service/list.html?frontCategoryId=${categorymap:$1|0}&$2=$3&$4=$5&$6=$7&city=${citymap:%1|%1}  [PT,L]

解释:

这个规则是想把-(中划线)转为=,把- -(两条中划线)转为&。

[^-]:^在字符集合符号([])之内表示反向选择,之外表示行首,所以表示不以-开头。

因为$N,N最大为9,所以使用了C,用第二条RewriteRule把第一条RewriteRule中的最后一个节点,即$8,进行继续转换。

此外,rewrite规则中如果遇到中文,相当有可能会出现乱码问题,因为apache在rewrite时会做一次url解码,这时jk进行请求转发时,就不会再是编码后的字符串了。此种情况,可以在一开始就进行两次编码(encode),或者在接收请求时先用ISO-8859-1取字节流,再使用UFT-8来new String。(new String(str.getBytes(”ISO-8859-1″),”UFT-8″))