我们已经准备好了,你呢?

2024我们与您携手共赢,为您提供优质的解决方案!

五、Apache伪静态配置和常用Rewrite伪静态规则

1. Apache虚拟机配置及伪静态规则

1)编辑Apache的conf目录下的httpd.conf文件。
去除"# LoadModule rewrite_module modules/mod_rewrite.so"的注释,开启mod_rewrite.so模块支持。
去除"# Include conf/extra/httpd-vhosts.conf"的注释,引入虚拟机配置文件。
 
2) 编辑httpd-vhost.conf
<VirtualHost *:80>
    #发生错误时将发送邮件
    #ServerAdmin test@kevin.com
    #文档根目录
    DocumentRoot "/data/www/httpd"
    #域名
    ServerName www.kevin.com
    #错误日志
    ErrorLog "logs/error.log"
    #访问日志
    CustomLog "logs/access.log"
    #配置rewrite相关选项
    <Directory "/data/www/httpd">
        #允许所有指令,这将允许.htaccess
        AllowOverride All
        #2.2的访问控制配置,先检查允许的条件,没有允许的全部禁止,中间只能有一个逗号不能有空格
        #Order Allow,Deny
        #Allow from All
        #2.4的访问控制配置,效果等同以上
        Require all granted
    </Directory>
 
3) 修改.htaccess
#以下表示:如果存在目录或文件则直接访问,否则执行RewriteRule
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
#隐藏index.php
RewriteRule ^(.*)$ index.php/$1 [L]
 
4) 重启apache服务

2. Apache伪静态配置示例

伪静态就是将原来动态化的页面址转换成为静态化的地址。
例如:
原访问地址:http://www.test.com/list.php?page=123&id=456
伪静态地址:http://www.test.com/list-123-456.html
 
操作方法:
1)首先确认Apache已经正确加载了mod_rewrite模块
检查httpd.conf中是否有LoadModule Rewrite_module modules/mod_Rewrite.so这段代码,如没有请加上。
 
2)策略配置。现有一个网站,根目录为/var/www/html,动态页面地址为/list.php?page=123&id=456,现在我们想要的效果是/list-123-456.html
 
2.1)使用httpd.conf来配置rewrite策略:
要使用httpd.conf文件来设置伪静态策略,可以直接在httpd.conf中写入如下代码,如果网站是配置在VirtualHost中,
则将这段代码加到对应的<VirtualHost hostname><VirtualHost>标签内:
 
<IfModule mod_rewrite.c>
#输入: list-123-456.html
#输出: list.php?page=123&id=456
RewriteEngine on
RewriteRule ^(.*)list-([0-9]+)-([0-9]+)\.html$ $1list.php?page=$1&id=$2
</IfModule>
 
添加完成后重启httpd服务后即可生效
 
2.2)使用.htaccess来配置rewrite策略
检查httpd.conf中的<Directory />标签配置,确认AllowOverride配置为All,这样才能启用.htaccess文件:
 
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
检查httpd.conf中的AccessFileName参数,确认为.htaccess
AccessFileName .htaccess
 
在网站根目录下建立.htaccess文件,写入如下内容:
RewriteEngine on
RewriteRule ^(.*)list-([0-9]+)-([0-9]+)\.html$ $1list.php?page=$2&id=$3
 
保存后重启httpd服务即可生效
 
常见问题:
1)为何都按上面设置了却还是无法静态化?
答:很有可能是因为别的目录设置项覆盖了<Directory />标签内的选项,导致.htaccess文件没起作用。
这个问题一般出现在网站根目录的Directory标签中,在这个例子中,可以检查<Directroy"/var/www/html">标签内的AllowOverride参数是否设置为All。
 
2).htaccess文件放在网站根目录,那子目录也可以实现伪静态吗?
答:.htaccess默认对所在目录下所有子目录生效,但是如果子目录中也放置了.htaccess文件,则该子目录下的访问规则以子目录中的.htaccess文件为准。

3. Apache开启伪静态示例(修改"AllowOverride ALL",打开支持.htaccess伪静态文件的功能)

伪静态只是改变了URL的显示形式,实际上还是网站页面还是动态页面。伪静态的页面后缀可以是html 、 htm 或者是目录格式等。那么为什么要用伪静态呢?
有两点原因:1是seo优化,伪静态有利于搜索引擎的收录,能够增加网站优化效果;2是url看起来简单,网站URL给人专业性。
 
1)加载Rewrite模块:
在conf目录下httpd.conf中找到
LoadModule rewrite_module modules/mod_rewrite.so
  
2)允许在任何目录中使用“.htaccess”文件,将“AllowOverride”改成“All”(默认为“None”):
  
# 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
  
# 把 AllowOverride None 改为 AllowOverride All,重启一下apache服务器使配置生效,这样就支持.htaccess文件了。
  
3)Apache Rewrite模块的简单应用
Rewrite的所有判断规则均基于Perl风格的正则表达式,通过以下基础示例能写出符合自己跳转需求的代码。
  
3.1)请求跳转
目的是如果请求为.jsp文件,则跳转至其它域名访问。
  
例如:
访问www.clin003.com/a.php跳转至b.clin003.com/b.php网页,访问www.clin003.com/news/index.php跳转至b.clin003.com/news/index.php网页
  
注意:
不是使用HTML技术中的meta或者javascript方式,因为www.clin003.com/a.php这个文件并不存在,用的是Apache2.2服务器中的Rewrite模块。
  
修改 .htaccess或apche的配置文件httpd.conf文件,添加以下内容
RewriteEngine on
#开启Rewrite模块
RewriteRule (.*)\.php$ http://b.clin003.com/$1\.jsp [R=301,L,NC]
#截获所有.jsp请求,跳转到http://b.clin003.com/加上原来的请求再加上.php。R=301为301跳转,L为rewrite规则到此终止,NC为不区分大小写
  
3.2)域名跳转
如果请求为old.clin003.com下的所有URL,跳转至b.clin003.com
  
RewriteEngine on
#开启Rewrite模块
RewriteCond %{REMOTE_HOST} ^old.studenthome.cn$ [NC]
#针对host为old.clin003.com的主机做处理,^为开始字符,$为结尾字符
RewriteRule (.*) http://b.clin003.com/$1 [R=301,L,NC]
  
3.3)防盗链
如果本网站的图片不想让其它网站调用,可以在 .htaccess或者apche的配置文件httpd.conf文件中添加以下内容
  
RewriteEngine on
#开启Rewrite模块
RewriteCond %{HTTP_REFERER} !^$
#如果不是直接输入图片地址
RewriteCond %{HTTP_REFERER} !img.clin003.com$ [NC]
#且如果不是img.clin003.com所有子域名调用的
RewriteCond %{HTTP_REFERER} !img.clin003.com/(.*)$ [NC]
RewriteCond %{HTTP_REFERER} !zhuaxia.com [NC]
RewriteCond %{HTTP_REFERER} !google.com [NC]
RewriteCond %{HTTP_REFERER} !google.cn [NC]
RewriteCond %{HTTP_REFERER} !baidu.com [NC]
RewriteCond %{HTTP_REFERER} !feedsky.com [NC]
RewriteRule (.*)\.(jpg|jpeg|jpe|gif|bmp|png|wma|mp3|wav|avi|mp4|flv|swf)$ http://clin003.com/err.jpg [R=301,L,NC]
#截获所有.jpg或.jpeg……请求,跳转到http://clin003.com/err.jpg提示错误的图片,注:该图片不能在原域名下,也不能在该.htaccess文件有效控制的文件夹中
 
对配置做几点补充说明:
L   表明当前规则是最后一条规则,停止分析以后重写
NC  不区分大小写
QSA 追加请求的字符串
^   表示语句开始
$   表示语句的结束
  
3.4)不需要定义.htaccess文件
在Apache2\conf\httpd.conf 最后一行添加
RewriteEngine On
RewriteRule ^(.*)-htm-(.*)$ $1.php?$2

4. Apache各种跳转(包括伪静态)的配置

1)404跳转:
#vim /etc/httpd/conf/httpd.conf
在虚拟主机配置里添加一行:ErrorDocument 404 /404.html
 
2)301跳转:
将不带www的跳转到带www的:在根目录下新建.htaccess文件,写入:
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^manyi.cc [NC]
RewriteRule ^(.*)$ http://www.manyi.cc/$1 [L,R=301]
 
重定向到新域名:
Options +FollowSymLinks
RewriteEngine on
RewriteRule ^(.*)$ http://www.manyi.cc/$1 [L,R=301]
 
3)在httpd.conf配置文件中配置:
<VirtualHost *:80>
ServerName manyi.cc
RedirectMatch permanent ^/(.*) http://www.manyi.cc/$1
</VirtualHost>
 
使用正则进行301伪静态配置:(将news.php?id=123这样的地址转向到news-123.html)
Options +FollowSymLinks
RewriteEngine on
RewriteRule ^news-(.+)\.html$ news.php?id=$1

5. FastCGI加载PHP伪静态设置的注意事项

默认的"RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]"规则在apache fastcgi模式下会导致"No input file specified".
修改成
RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]
这样就好了,地址正常重写。
 
#php api模式,服务器能识别PATH_INFO
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
 
#php fastcgi模式 服务器不识别PATH_INFO
RewriteRule ^(.*)$ index.php [E=PATH_INFO:$1,QSA,PT,L]


我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求...
请立即点击咨询我们或拨打咨询热线: 13718557531,我们会详细为你一一解答你心中的疑难。项目经理在线

我们已经准备好了,你呢?

2020我们与您携手共赢,为您的企业形象保驾护航!

在线客服
联系方式

热线电话

13718557531

上班时间

周一到周五

公司电话

13718557531

二维码
微信
线