Apache和Nginx设置伪静态(URL Rewrite)的方法

原文地址:http://bbs.qcloud.com/forum.php?mod=viewthread&tid=3545

apache/nginx伪静态在线转换:http://www.anilcetin.com/convert-apache-htaccess-to-nginx/

Apache 2.x

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

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

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

            
      我就用这个网站为例子介绍下具体的配置,在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文件,写入如下内容:

RewriteEngine on
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进行域名层面的重写跳转,接下来可以找些资料慢慢补充。

时间: 2024-08-12 13:41:38

Apache和Nginx设置伪静态(URL Rewrite)的方法的相关文章

虚拟主机设置伪静态的三种方法

如今,很多站长都有使用香港虚拟主机来搭建网站,比较常见的有Linux香港虚拟主机.Windows香港虚拟主机. 值得一提的是,为了有利于网站的收录,很多站长使用香港虚拟主机搭建好网站后,一般都会进行伪静态设置.那么,在使用香港虚拟主机的话,网站的伪静态是怎么设置的?这里就来简单的了解下. 目前,Windows香港虚拟主机采用的是IIS服务器,而Linux香港虚拟主机采用的是Apache服务器.因此,如果要想设置伪静态的话,我们需要在其相应的配置文件中进行设置,对应关系如下: 1.iis7.iis

nginx 设置网站目录访问验证方法【转载】

为网站目录设置访问验证之后我们就是进入此页面都需要输入验证密码才可以,下面我来介绍nginx中配置目录访问验证码方法总结. 1.创建类htpasswd文件 执行:  代码如下 复制代码 wget -c soft.vpser.net/lnmp/ext/htpasswd.sh;bash htpasswd.sh 按提示输入用户名.密码.及认证文件名.脚本会自动生成认证文件.记录下脚本返回的文件路径.如:/usr/local/nginx/conf/vpser.net.auth. 2.为Nginx添加au

php 伪静态 (url rewrite mod_rewrite 重写)

mod_rewrite是Apache的一个非常强大的功能,它可以实现伪静态页面.下面我详细说说它的使用方法!对初学者很有用的哦!1.检测Apache是否支持mod_rewrite通过php提供的phpinfo()函数查看环境配置,通过Ctrl+F查找到"Loaded Modules",其中列出了所有apache2handler已经开启的模块,如果里面包括"mod_rewrite",则已经支持,不再需要继续设置. 如果没有开启"mod_rewrite&quo

Apache、NGINX支持中文URL

Apache(32位):安装环境:CentOS 5.6 + Apache 2.2.15安装结果:安装后支持“中文图片.文件名”链接直接打开以下为安装过程:1.下载安装包 wget ftp://ftp.aconus.com/fc5/mod_encoding/mod_encoding-2.2.0-1.i386.tar.gz 2.直接解压 tar zxvf mod_encoding-2.2.0-1.i386.tar.gz 看到2个rpm安装包,进行安装 rpm -ivh iconv_hook-1.0.

Apache与Nginx设置跨域请求

我们在前端使用代理请求时,要先设置服务器允许跨域请求,下面先来介绍几个常用的配置 (1)Access-Control-Allow-Origin 该字段是必须的.它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求. (2)Access-Control-Allow-Credentials 该字段可选.它的值是一个布尔值,表示是否允许发送Cookie.默认情况下,Cookie不包括在CORS请求之中.设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服

百度云虚拟主机BCH怎么设置伪静态—url重写

第一步:在网站的根目录里面(webroot目录下)新建一个 bcloud_nginx_user.conf 文件(bch是不允许修改基础配置文件,只能通过加载自定义配置文件),写入如下代码: #百度云虚拟空间nginx服务器的配置location / {if (!-e $request_filename) {rewrite ^(.*)$ /index.php?s=/$1 last;break;}} 第二步:在主机控制面板中找到[站点启停],点击[重载站点]服务.(切记修改完规则之后一定要重新加载,

IIS7.5使用web.config设置伪静态的二种方法(转)

近几天公司里开发的项目有几个运行在IIS7.5上,由于全站采用的是伪静态,因此从网上找到两两种方法来实现.这两种方法各有优势:第一种比较灵活,只要把文件拷到根目录下,即可直接显示所有伪静态页面(适用于此伪静态规则的所有项目,如ThinkPHP),无需更改代码:第二种适合有子目录时的伪静态,比如一个网站下有多个子网站且都要使用伪静态,那么就考虑使用第二种方法了,第一种会报错误.两种方法,自己根据情况使用吧(当然,并不是适用所有项目,可以根据项目的伪静态规则自行调整).以下是代码: 第一种方法:we

nginx discuz 伪静态rewrite规则

越来越多的人把apache转到nginx,对于运行php来说,转移比较容易些. 但要实现伪静态,rewrite配置就会复杂一些,大多数人的问题都出在这里. 下面是nginx下discuz url rewrite配置模板,供大家参考. 注意:修改server_name,root为你的实际配置. 其它常见rewrite nginx wordpress rewrite规则 nginx cakephp rewrite规则 server { listen 80; server_name www.264.c

(转)apache和nginx的区别

nginx 相对 apache 的优点: 轻量级,同样起web 服务,比apache 占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能 高度模块化的设计,编写模块相对简单 社区活跃,各种高性能模块出品迅速啊 apache 相对nginx 的优点: rewrite ,比nginx 的rewrite 强大(rewrite把传入Web的请求重定向到其他URL的过程.URL Rewrite最常见的应用是URL伪