欢迎您来到腾讯云!积分商城

腾讯云腾讯云论坛

 找回密码
 立即注册
快捷导航
搜索
查看: 28615|回复: 11

[经验分享] Apache和Nginx设置伪静态(URL Rewrite)的方法

[复制链接]

1

主题

0

好友

154

积分

小白[LV1]

Rank: 1

云币
453
威望
154
发表于 2015-1-13 16:43:46 |显示全部楼层 |未分类
本帖最后由 EZCloud 于 2015-1-13 22:16 编辑

前言

    伪静态就是将原来动态化的页面址转换成为静态化的地址,例如:
        原访问地址:http://www.test.com/list.php?page=123&id=456

        伪静态地址:http://www.test.com/list-123-456.html

    这样原来的动态地址变成一个静态的地址,更有利于搜索引擎的收录,伪静态化在站长进行SEO时是一个必要的操作,下面我来详细介绍一下在Apache和Nginx中伪静态的设置方法。

Apache 2.x

1、首先我们要确认Apache已经正确加载了mod_rewrite模块
      检查httpd.conf中是否有LoadModule Rewrite_module modules/mod_Rewrite.so这段代码,如没有请加上。
            1.png


      可以使用phpinfo确认是否已经正确加载此模块,如已加载,mod_rewrite会显示在Loaded Modules中,如图:
          2.png


2、策略配置。现有一个网站,根目录为/var/www/html,动态页面地址为/list.php?page=123&id=456,现在我们想要的效果是/list-123-456.html

             3.png

            
      我就用这个网站为例子介绍下具体的配置,在Apache中有两种方法配置,一是通过httpd.conf文件,二是通过.htaccess文件,策略语句的原理是使用正则表达式来匹配访问路径,并按照规则替换成指定的路径:

使用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服务后即可生效
使用.htaccess来配置rewrite策略

检查httpd.conf中的<Directory />标签配置,确认AllowOverride配置为All,这样才能启用.htaccess文件:
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
检查httpd.conf中的AccessFileName参数,确认为.htaccess
AccessFileName .htaccess
在网站根目录下建立.htaccess文件,写入如下内容:
  1. RewriteEngine on
  2. RewriteRule ^(.*)list-([0-9]+)-([0-9]+)\.html$ $1list.php?page=$2&id=$3
复制代码
保存后重启httpd服务即可生效

常见问题:
Q:为何都按上面设置了缺还是无法静态化?
A:很有可能是因为别的目录设置项覆盖了<Directory />标签内的选项,导致.htaccess文件没起作用。这个问题一般出现在网站根目录的Directory标签中,在这个例子中,可以检查<Directroy "/var/www/html">标签内的AllowOverride参数是否设置为All。

Q:.htaccess文件放在网站根目录,那子目录也可以实现伪静态吗?
A:.htaccess默认对所在目录下所有子目录生效,但是如果子目录中也放置了.htaccess文件,则该子目录下的访问规则以子目录中的.htaccess文件为准。

Nginx:
      Nginx下设置伪静态方法与Apache差不多,直接在nginx.conf (或者在对应的*.conf) 中找到需设置伪静态规则的服务器对应字段,在server{ location/{ } }中添加以下代码:

server {
    listen 80 default_server;
    server_name _;
    location / {
         root /usr/share/nginx/html;
         index index.html index.htm;
         rewrite ^(.*)list-([0-9]+)-([0-9]+)\.html$ $1list.php?page=$2&id=$3;
         }
}
添加后重启Nginx服务即可生效!

正则表达式匹配

      就用上面的例子中的伪静态策略来简单解释下正则表达式在配置的作用:
策略:RewriteRule ^(.*)list-([0-9]+)-([0-9]+)\.html$ $1list.php?page=$2&id=$3
请求路径:http://www.abc.com/list-123-456.html

本策略分成两段,第一段是使用正则表达式去匹配请求访问的路径,第二段是将匹配后的参数转化为真实访问的路径。策略执行时:^(.*)list-([0-9]+)-([0-9]+)\.html$ /list-123-456.html 这个字符串进行匹配:
  • ^和$字符分别代表了匹配输入字符串的开始和结束
  • ()中的匹配到的内容会被按顺序分配到变量$1 $2 $3中
  • .*匹配任意字符串,且长度从0个到多个,故$1值为/
  • [0-9]+匹配字符0-9,长度1个到多个,故$2和$3分别是123和456

所以最后真实访问的动态地址为 /list.php?page=123&id=456

上面只是介绍了基本的配置策略,其实这个rewrite规则还有非常多的玩法,例如使用RewriteCond进行域名层面的重写跳转,接下来可以找些资料慢慢补充。


24

主题

2

好友

586

积分

腾讯云论坛管理组

Rank: 20Rank: 20

云币
1727
威望
586
发表于 2015-1-13 17:07:36 |显示全部楼层
支持一个
回复

使用道具 举报

2

主题

2

好友

1321

积分

攻城师[LV3]

Rank: 3Rank: 3Rank: 3

云币
5086
威望
1321
发表于 2015-1-17 20:15:05 |显示全部楼层
支持支持支持学习学习学习
回复

使用道具 举报

0

主题

0

好友

12

积分

小白[LV1]

Rank: 1

云币
23
威望
3
发表于 2015-7-5 00:41:33 |显示全部楼层
httpd.conf这个文件在哪里找到???
回复

使用道具 举报

426

主题

85

好友

5488

积分

资深攻城师[LV4]

Rank: 4

云币
1869
威望
5488
发表于 2015-7-6 10:27:34 |显示全部楼层
考研复习站 发表于 2015-7-5 00:41
httpd.conf这个文件在哪里找到???

find / -name httpd.conf
回复

使用道具 举报

0

主题

0

好友

70

积分

小白[LV1]

Rank: 1

云币
30
威望
30
发表于 2016-6-2 12:47:29 |显示全部楼层
麻烦老师帮我看看我添加的对不对nginx,  

#-+-+-+-+-+-+-+-+-+-+ id: 9 --- ftp name: chongwu --- user: zijidelu +-+-+-+-+-+-+-+-+-+

server {
        server_name   chongwuliangcang.com www.chongwuliangcang.com ;

        listen       80;

        if ($http_transfer_encoding ~* chunked) {
                return 444;
        }

        gzip on;

        if (-d $request_filename) {

                rewrite ^/(.*)([^/])$ $scheme://$host/$1$2/ permanent;
        }

        error_log                /home/hosts_log/9_error.log notice;
        access_log                /home/hosts_log/9_access.log lu_access_log_1 buffer=32k;

         error_page 403 /__ErrorFiles__/403.html;
         error_page 404 /__ErrorFiles__/404.html;

         error_page 500 /__ErrorFiles__/500.html;
         error_page 501 /__ErrorFiles__/501.html;
         error_page 502 /__ErrorFiles__/502.html;

         root   /home/ftp2/1520/chongwu-20160601-SxM/chongwuliangcang.com/;

         ssi off;
         ssi_silent_errors off;
         ssi_types text/shtml;

        location / {server {
    listen 80 default_server;
    server_name _;
    location / {
         root /usr/share/nginx/html;
         index index.html index.htm;
         rewrite ^(.*)list-([0-9]+)-([0-9]+)\.html$ $1list.php?page=$2&id=$3;
         }
}
回复

使用道具 举报

0

主题

0

好友

70

积分

小白[LV1]

Rank: 1

云币
30
威望
30
发表于 2016-6-2 12:47:36 |显示全部楼层
麻烦老师帮我看看我添加的对不对nginx,  

#-+-+-+-+-+-+-+-+-+-+ id: 9 --- ftp name: chongwu --- user: zijidelu +-+-+-+-+-+-+-+-+-+

server {
        server_name   chongwuliangcang.com www.chongwuliangcang.com ;

        listen       80;

        if ($http_transfer_encoding ~* chunked) {
                return 444;
        }

        gzip on;

        if (-d $request_filename) {

                rewrite ^/(.*)([^/])$ $scheme://$host/$1$2/ permanent;
        }

        error_log                /home/hosts_log/9_error.log notice;
        access_log                /home/hosts_log/9_access.log lu_access_log_1 buffer=32k;

         error_page 403 /__ErrorFiles__/403.html;
         error_page 404 /__ErrorFiles__/404.html;

         error_page 500 /__ErrorFiles__/500.html;
         error_page 501 /__ErrorFiles__/501.html;
         error_page 502 /__ErrorFiles__/502.html;

         root   /home/ftp2/1520/chongwu-20160601-SxM/chongwuliangcang.com/;

         ssi off;
         ssi_silent_errors off;
         ssi_types text/shtml;

        location / {server {
    listen 80 default_server;
    server_name _;
    location / {
         root /usr/share/nginx/html;
         index index.html index.htm;
         rewrite ^(.*)list-([0-9]+)-([0-9]+)\.html$ $1list.php?page=$2&id=$3;
         }
}
回复

使用道具 举报

0

主题

0

好友

70

积分

小白[LV1]

Rank: 1

云币
30
威望
30
发表于 2016-6-2 12:49:02 |显示全部楼层
denniszyang 发表于 2015-7-6 10:27
find / -name httpd.conf

麻烦老师帮我看看我添加的对不对nginx,  

#-+-+-+-+-+-+-+-+-+-+ id: 9 --- ftp name: chongwu --- user: zijidelu +-+-+-+-+-+-+-+-+-+

server {
        server_name   chongwuliangcang.com www.chongwuliangcang.com ;

        listen       80;

        if ($http_transfer_encoding ~* chunked) {
                return 444;
        }

        gzip on;

        if (-d $request_filename) {

                rewrite ^/(.*)([^/])$ $scheme://$host/$1$2/ permanent;
        }

        error_log                /home/hosts_log/9_error.log notice;
        access_log                /home/hosts_log/9_access.log lu_access_log_1 buffer=32k;

         error_page 403 /__ErrorFiles__/403.html;
         error_page 404 /__ErrorFiles__/404.html;

         error_page 500 /__ErrorFiles__/500.html;
         error_page 501 /__ErrorFiles__/501.html;
         error_page 502 /__ErrorFiles__/502.html;

         root   /home/ftp2/1520/chongwu-20160601-SxM/chongwuliangcang.com/;

         ssi off;
         ssi_silent_errors off;
         ssi_types text/shtml;

        location / {server {
    listen 80 default_server;
    server_name _;
    location / {
         root /usr/share/nginx/html;
         index index.html index.htm;
         rewrite ^(.*)list-([0-9]+)-([0-9]+)\.html$ $1list.php?page=$2&id=$3;
         }
}
回复

使用道具 举报

0

主题

0

好友

70

积分

小白[LV1]

Rank: 1

云币
30
威望
30
发表于 2016-6-2 12:49:08 |显示全部楼层
denniszyang 发表于 2015-7-6 10:27
find / -name httpd.conf

麻烦老师帮我看看我添加的对不对nginx,  

#-+-+-+-+-+-+-+-+-+-+ id: 9 --- ftp name: chongwu --- user: zijidelu +-+-+-+-+-+-+-+-+-+

server {
        server_name   chongwuliangcang.com www.chongwuliangcang.com ;

        listen       80;

        if ($http_transfer_encoding ~* chunked) {
                return 444;
        }

        gzip on;

        if (-d $request_filename) {

                rewrite ^/(.*)([^/])$ $scheme://$host/$1$2/ permanent;
        }

        error_log                /home/hosts_log/9_error.log notice;
        access_log                /home/hosts_log/9_access.log lu_access_log_1 buffer=32k;

         error_page 403 /__ErrorFiles__/403.html;
         error_page 404 /__ErrorFiles__/404.html;

         error_page 500 /__ErrorFiles__/500.html;
         error_page 501 /__ErrorFiles__/501.html;
         error_page 502 /__ErrorFiles__/502.html;

         root   /home/ftp2/1520/chongwu-20160601-SxM/chongwuliangcang.com/;

         ssi off;
         ssi_silent_errors off;
         ssi_types text/shtml;

        location / {server {
    listen 80 default_server;
    server_name _;
    location / {
         root /usr/share/nginx/html;
         index index.html index.htm;
         rewrite ^(.*)list-([0-9]+)-([0-9]+)\.html$ $1list.php?page=$2&id=$3;
         }
}
回复

使用道具 举报

0

主题

0

好友

22

积分

小白[LV1]

Rank: 1

云币
10
威望
10
发表于 2016-6-2 14:02:12 来自手机 |显示全部楼层
怎么回事,微信上不了,电话打了N遍,人口无,烦一天
来自: 微社区
回复

使用道具 举报

0

主题

0

好友

70

积分

小白[LV1]

Rank: 1

云币
30
威望
30
发表于 2016-6-2 15:17:02 |显示全部楼层
2016060205RYFfQ 发表于 2016-6-2 14:02
怎么回事,微信上不了,电话打了N遍,人口无,烦一天

覆盖安装新版本微信试试呢
回复

使用道具 举报

0

主题

0

好友

60

积分

小白[LV1]

Rank: 1

云币
180
威望
60
发表于 2017-9-7 16:29:06 |显示全部楼层
感谢分享…………
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

联系我们|腾讯云平台|积分商城|腾讯云官方论坛    

GMT+8, 2020-8-6 06:03 , Processed in 1.139984 second(s), 35 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部