apache php 开启伪静态
打开apache的配置文件httpd.conf 找到 #LoadModule rewrite_module modules/mod_rewrite.so 把前面#去掉。没有则添加,但必选独占一行,使apache支持 mod_rewrite 模块 找到 <Directory "D:/ApacheServer/web"> # # 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 None # # Controls who can get stuff from this server. # Order allow,deny Allow from all </Directory> 把 AllowOverride None 换成 AllowOverride All 使apache支持 .htaccess 文件 重启apache服务器 在要启用伪静态的 PHP 项目根目录下建立 .htaccess 文件 在 .htaccess 文件中输入内容 <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine on #本地测试的例子 RewriteRule index.html$ index.php RewriteRule index-([1-9]+[0-9]*).html$ index.php?p=$1 RewriteRule ([a-z]{1,})-([0-9]{1,}).html$ index.php?action=$1&id=$2 #再附几个常用的规则内容 #访问index.html导向访问index.php?page=index RewriteRule index.html$ index.php?page=index [L] #禁止访问git文件夹 RewriteRule ^.git - [F,L] #301重定向,自动在网址后加反斜杠 / ,文件路径除外(会先访问该文件,找不到则在文件路径后也加 /) #RewriteBase / 是设置了重写的基准为该域名的根目录,写了这个的话,RewriteRule . index.php 就可以了,但是没写的话,就要多一个斜杠了RewriteRule . /index.php RewriteBase / #如果不是文件,才会执行下一条RewriteRule。 RewriteCond %{REQUEST_FILENAME} !-f #如果不是目录,才会执行下一条RewriteRule #RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !(.*)/$ RewriteRule ^(.*)$ $1/ [L,R=301] #当访问products/mobile-phones/gdshdfh/或者products/tablets/gdshdfh/或者products/wear/gdshdfh/ 等的时候都指向同一路径 products/overview/ename/$2/,gdshdfh这里为乱想,匹配正则2的公式[a-zA-Z0-9-]{1,}即可 RewriteRule products/(mobile-phones|tablets|wear|home-internet-media|accessories)/([a-zA-Z0-9-]{1,})/$ products/overview/ename/$2/ [QSA,PT,L] #伪静态也有缓存,修改规则后要清缓存 </IfModule> 注释: RewriteEngine 为重写引擎开关,on为开启,off为关闭。 RewriteRule 是路由转向规则,$ 之前路径为浏览器中要输入路径,这里可以用正则表达式表达。$+空格 后路径为后台实际转向路径, 转向后台实际路径时可以传参数,例子里的后台页面可以用$_GET['p'] $_GET['action'] $_GET['id'] 来接收 $1 代表浏览器路径中输入的第一个正则表达式的值,以此类推,$2代表第二个正则表达式的值 RewriteRule 路由转向规则里正则表达式用括号 () 括起来 RewriteRule 后面中括号里的大写字符注释 NC : no case,就是说不区分大小写 R : redirect,重定向 F : forbidden,禁止访问,强制当前URL为被禁止的,即,立即反馈一个HTTP响应代码403(被禁止的)。 使用这个标记,可以链接若干RewriteConds以有条件地阻塞某些URL L : last,表示已经是最后一条规则,立即停止重写操作,并不再应用其他重写规则。 QSA : qsappend,此标记强制重写引擎在已有的替换串中追加一个请求串,而不是简单的替换。 如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。 PT : passthrough,此标记强制重写引擎将内部结构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。 +FollowSymlinks : 打开FollowSymlinks项,某些服务器配置中,mod_rewrite要求有followsymlinks,否则会显示500内部服务器错误,如果没有指定FollowSymLinks的选项(即Options FollowSymLinks),或者指定了 SymLinksIfOwnerMatch选项,Apache将不得不调用额外的系统函数来检查符号链接。每次针对文件名的请求都将触发一次检查 -Multiviews : 关闭Multiviews,MultiViews的效果是:如果服务器收到对/some/dir/foo的请求,而/some/dir/foo并不存在,但是如果/some/dir 启用了MultiViews ,则服务器会查找这个目录下所有的foo.* 文件,并有效地伪造一个说明这些foo.* 文件的类型表,分配给他们相同的媒体类型及内容编码,并选择其中最合适的匹配返回给客户 例子所在项目为test 在项目下 index.php 页面内写入内容 <?php if ($_GET ['p']) { echo "p : " . $_GET ['p']; } if ($_GET ['action']) { echo "action : " . $_GET ['action']; } if ($_GET ['id']) { echo "id : " . $_GET ['id']; } ?> 在浏览器中输入 http://localhost/test/index.html http://localhost/test/index-99.html http://localhost/test/page-18.html 都会转向 http://localhost/test/index.php 页面 并且依次 http://localhost/test/index.html 页面什么都不显示 http://localhost/test/index-99.html 页面显示 p : 99 http://localhost/test/page-18.html 页面显示 action : pageid : 18