在实际开发中,我们实现伪静态,用的更多的还是rewrite 机制,但是他任然是以正则技术为基础的.
我们看看如何实现:
说明:
比如 http://www.hsp.com/news.php?type=music&id=100
希望上面的url 变成
http://www.hsp.comt/news-music-id100.html
步骤开始:
(1) 启用rewrite模块,在默认情况下,没有启用
修改httpd.conf文件
#启动rewrite模块
LoadModule rewrite_modulemodules/mod_rewrite.so
确认是否启动成功
<?php phpinfo();?>
(2) 配置我们的虚拟主机
httpd.conf 打开虚拟主机的配置文件
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
修改httpd-vhost.conf
<VirtualHost *:80>
DocumentRoot "C:/myenv/apache/htdocs/static2"
#Directory配置节点,用于指定该目录下的文件或是图片.的访问权限
#设置虚拟主机的错误页面,欢迎页面
<Directory "C:/myenv/apache/htdocs/static2">
</Directory>
</VirtualHost>
(3) 在hosts文件中,配置ip和主机的对应关系
127.0.0.1 www.hsp.com
(4) 这时我们访问 http//www.hsp.com/news.php
我们可以访问到该页面.
☞ 一个重要的知识点:
在apache服务器中,如果某个文件夹,没有指定访问权限,则以上级目录的权限为准,如果他自己指定了访问权限,则以自己的为准.
请注意,在配置访问权限的时候,顺序很重要:
#Order allow,deny 表示先看allow ,在看deny,留下的就是可以访问
Order deny,allow
Deny from all
allow from 127.0.0.1
(5) 关于<Directory> 节点配置必须掌握
比较完整的配置文件
第一种配置方式
<VirtualHost *:80>
DocumentRoot "C:/myenv/apache/htdocs/static2"
#Directory配置节点,用于指定该目录下的文件或是图片.的访问权限
#设置虚拟主机的错误页面,欢迎页面
ServerName www.hsp.com
<Directory"C:/myenv/apache/htdocs/static2">
#这里可以指定是否让人访问
#Allowfrom all
#是否列出文件目录结构
#如果希望列出 indexes不希望 none
#Optionsindexes
#如何配置网站的首页面
DirectoryIndexabc.html abc2.html
#如何配置404错误页面,引导用户引入新页面
errorDocument404 /404.html
#配置我们的rewrite规则
RewriteEngineOn
#rewrite的规则 如果 aaa.html 就跳转到news.php
#$1表示反向引用,第一个子表达式的内容
#说明如果在正则规范中直接引用子表达式的内容,则使用\n
#如果是在后面因为,则使用$n
RewriteRulenews-([a-zA-Z]+)-id(\d+)\.html$ news.php?type=$1&id=$2
</Directory>
</VirtualHost>
特别说明: 容易犯的错误,一定要记住启用rewrite模块.
思考: 上面我们配置都要去修改 httpd-vhost.文件,但管理员不给你这个权限,怎么办?
思路: 可以把配置,写到 .htaccess文件.
第二种配置方式: 即把一部分配置放在 http-vhost.conf 文件, 把rewrite 规则放在 .htaccess
<VirtualHost *:80>
DocumentRoot "C:/myenv/apache/htdocs/static2"
#Directory配置节点,用于指定该目录下的文件或是图片.的访问权限
#设置虚拟主机的错误页面,欢迎页面
ServerName www.hsp.com
<Directory "C:/myenv/apache/htdocs/static2">
#这里可以指定是否让人访问
#Allowfrom all
#是否列出文件目录结构
#如果希望列出 indexes不希望 none
#Optionsindexes
#如何配置网站的首页面
DirectoryIndexabc.html abc2.html
#如何配置404错误页面,引导用户引入新页面
errorDocument404 /404.html
#如果你配置了allowoverride all 这表示到对应的目录的.htaccess去匹配规则
allowoverrideall
</Directory>
</VirtualHost>
在对应的文件下.htaccess文件
<IfModule rewrite_module>
#如果rewrite 模块启用
#配置我们的rewrite规则
RewriteEngine On
#rewrite的规则如果 aaa.html 就跳转到news.php
#$1 表示反向引用,第一个子表达式的内容
#说明如果在正则规范中直接引用子表达式的内容,则使用\n
#如果是在后面因为,则使用$n
RewriteRulenews-([a-zA-Z]+)-id(\d+)\.html$ news.php?type=$1&id=$2
#RewriteRule aaa.html news.php
</IfModule>
请注意: 项目中的 .htaccess文件的配置也是继承管理
第三种配置方法:
http-vhost.conf
<VirtualHost *:80>
DocumentRoot "C:/myenv/apache/htdocs/static2"
#Directory配置节点,用于指定该目录下的文件或是图片.的访问权限
#设置虚拟主机的错误页面,欢迎页面
ServerName www.hsp.com
<Directory "C:/myenv/apache/htdocs/static2">
#如果你配置了allowoverride all 这表示到对应的目录的.htaccess去匹配规则
allowoverrideall
</Directory>
</VirtualHost>
.htacces文件
#这里可以指定是否让人访问
#Allowfrom all
#是否列出文件目录结构
#如果希望列出 indexes不希望 none
#Optionsindexes
#如何配置网站的首页面
DirectoryIndexabc.html abc2.html
#如何配置404错误页面,引导用户引入新页面
errorDocument404 /404.html
<IfModule rewrite_module>
#如果rewrite 模块启用
#配置我们的rewrite规则
RewriteEngine On
#rewrite的规则如果 aaa.html 就跳转到news.php
#$1 表示反向引用,第一个子表达式的内容
#说明如果在正则规范中直接引用子表达式的内容,则使用\n
#如果是在后面因为,则使用$n
RewriteRulenews-([a-zA-Z]+)-id(\d+)\.html$ news.php?type=$1&id=$2
#RewriteRule aaa.html news.php
</IfModule>
u 伪静态的实际运用
1. 在一个项目中有两个文件夹,public 和 private ,public文件夹的图片可以被所有人访问.private只能自己访问.请问如何实现.
第一个方法是. 在 public 和 private 下创建 .htaccess 文件,对于private 只让127.0.0.1访问 public 文件都可以访问
private 文件夹下的配置 .htaccess
Order deny, allow
deny from all
allow from 127.0.0.1
这个的缺点是,没有办法去控制,本apahce的另外一个虚拟主机请求., 另外不能精细化控制,于是我们就换了一个思路使用 http的 referer头信息搞定这个防盗链需求.
第二方法.在private 文件夹下 .htaccess
<ifModule rewrite_module>
RewriteEngine On
#你怎么知道,这个请求就是www.hsp.com发来的. referer
#如果你请求的是一个jpg图片, 就禁止
RewriteCond %{HTTP_REFERER}!www.hsp.com
RewriteRule .*\.jpg -[F]
</ifModule>
☞ 说一下如果你的RewriteCond有多个条件
<ifModule rewrite_module>
RewriteEngine On
#你怎么知道,这个请求就是www.hsp.com发来的. referer
#如果你请求的是一个jpg图片, 就禁止
RewriteCond %{HTTP_REFERER} !www.hsp.com
#RewriteCond %{ REQUEST_FILENAME} !-f
RewriteRule .*\.jpg -[F]
</ifModule>
u 伪静态实际运用案例2
在www.hsp.com 的主目录下,我们编写了 .htaccess文件,并增加规则
#增加规则
RewriteRule index\/login index.php?c=index&a=login
RewriteRule ([a-zA-Z_]+)\/([a-zA-Z_]+) index.php?c=$1&a=$2
u 伪静态的实际运用3->引出rewriteCond的使用
思考: 可能有条件指令.
网上找到方案:
最后的配置在.htaccess
#如果请求的不是一个文件
RewriteCond %{REQUEST_FILENAME} !-f
#并且不是一个目录
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ccc.html index.php
伪静态的实际运用案例4:
在TP框架中使用rewrite简化url地址,目的是SEO, 步骤
1. 在httpd.conf 文件中启用rewrite模块
2. 在虚拟主机中配置 allowoverride all
3. 在tp的配置文件中conf/config 文件把 URL_MODEL 配置2
4. 在tp框架的入口目录增加.htaccess文件 写入规则
<IfModule mod_rewrite.c>RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)(?!WebApp)$ index.php/$1 [QSA,PT,L]
</IfModule>