重写 | 二大人
Width Mode: Auto ? Font size: Small | Normal | Large

与‘ 重写 ’相关的文章:

.htaccess常见问题

一、RewriteRule 后向引用的时候只能使用1-9 九个数字,0是整个截取的URL,如果超出了十个就没有办法继续引用了。

解决办法:此时可以借用RewriteCond 来帮助存入缓存几个,因为它引用的办法是% 。

例如:把u-1-2-3-4-5-6-7-8-9-10-11 跳转到 ?m=1&uid=2&username=3&subject=4&dateline1=5&dateline2=6&orderby=7&ordersc=8&perpage=9&page=10&end=11 这样一个冗余的网址。通过借用RewriteCond 缓存了三个变量。

RewriteCond %{REQUEST_URI} /u-([^-]*?)-([^-]*?)-([^-]*?)-
RewriteRule ^u-[^-]*?-[^-]*?-[^-]*?-([^-]*?)-([^-]*?)-([^-]*?)-([^-]*?)-([^-]*?)-([^-]*?)-(.*)  ?m=%1&uid=%2&username=%3&subject=$1&dateline1=$2&dateline2=$3&orderby=$4&ordersc=$5&perpage=$6&page=$7&end=$8  [L]

二、待转向的URL存在?,正则中无法替代(chrom在空的form提交的时候url后面居然自动补一个问号)

举个简单的例子: 将u-1-2-?page=2  转到 ?m=1&username=2&page=2

简单的一个小例子,可是不知道?没有办法转义的话,会急死人。

我们可能会这样写:RewriteRule ^u-([^-]*?)-([^-]*?)-\?(.*)$ ?m=$1&username=$2$3 .但是因为问号没有办法转义,所以问号这一关是难以通过。

经过大量的测试,初步采取如下办法:

通过利用RewriteCond 的 %{QUERY_STRING}把page对应的参数截取下来。

所以能通过的方法是:

RewriteCond %{QUERY_STRING} ^page=(.+)$

RewriteRule ^u-([^-]*?)-(\w+)-$ ?m=$1&username=$2&page=%3

若干月后发现了一个小秘密,

解决的办法是用QSA‘(追加查询字符串)
手册上是这么写的:

qsappend|QSA‘(追 加查询字符串)

此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。

意思是强制追加参数!看来手册仍要好好看!

故非常简单即:RewriteRule ^u-([^-]*?)-([^-]*?)- ?m=$1&username=$2  [L ,QSA]

三、url请求匹配的顺序

是按照先后顺序一个个匹配,不满足往下走,满足了执行RewriteRule 然后碰到[L]离开去寻找指定的文件。

四、get提交数据进行URL改写

简单的一个小例子

<form name=”nbphp”  id=”tosearch” mothed=”get” onsubmit=”return to_search();”>

<input type=”text” name=”m”  id=”m” />

<input type=”submmit” value=”search”>

</form>

<script language=”javascript”>

function to_search(){

var m=$(‘#m’).val();

document.nbphp.action=’u-’m;

$(‘#to_search’).html(”);

}

</script>

用的jquery简单举个例子,其实原理很简单,数据提交之前用js先或许要提交的input的值,把这些值编成自己喜欢的url,然后作为form的action。最后把form里面所有的东西都清空,这样url就没有问号和与符号了,很清爽,可以用-或者/来连接变量。

url改写

get提交url改写

由浅入深剖析.htaccess全教程

本教程依次从以下几个方面介绍.htaccess相关知识。

  1. .htaccess文件使用前提
  2. .htaccess基本语法介绍
  3. 现学现用,学习正则表达式
  4. 常见的.htaccess应用举例
  5. 一些其他功能

一、.htaccess文件使用前提

.htaccess的主要作用就是实现url改写,也就是当浏览器通过url访问到服务器某个文件夹时,作为主人,我们可以来接待这个url,具体地怎样接待它,就是此文件的作用。所有的访问都是通过URL实现,所以.htaccess的作用非同小可。正因为此,所以一般地网站通过设置.htaccess,通过一个十分友好的url吸引用户进来,然后用.htaccess把用户带到需要访问的位置。

要想使用这个强大功能,就得开启apache里面的重写模块。

前面的文章中曾经讲到过windows和ubuntu开启 rewrite模块使用.htaccess

其实开启模块大体的步骤都是一样的,无论是Windows和linux。

二、.htaccess基本语法介绍

开启重写引擎 :RewriteEngine on

设置重写的根目录:RewriteBase /     — 说明 :因为定义了这个文件夹,所以对应的替换就有了一个参照。

匹配所有符合条件的请求:RewriteCond       — 说明:RewriteCond 定义了一系列规则条件,这个指令可以有一条或者多条,只有用户拿来的url符合这些条件之后,我们的.htaccess才开始接待,否则用户就直接自己去访问所需要的目录了。

举个例子,为了能让搜索引擎更多地抓取我们的网页而避免重复抓,我们通常把没有www的域名重定向到www.XXX.com,如下就实现了这个功能:

RewriteEngine On

RewriteCond %{HTTP_HOST}  ^nbphp\.com$ [NC]

RewriteRule ^(.*)$  http://www.nbphp.com/$1 [R=301,L]

上例便把nbphp.com 重定向到www.nbphp.com

%{HTTP_HOST} 是指取得用户访问的URL的主域名  然后空格后面是一个正则表达式匹配,意识就是说是否是 nbphp.com 。

如果用户访问使用的URL满足所有列出的RewriteCond 提出的条件,那么进行下一步RewriteRule 即开始进行引导,这才开始实现.htaccess文件的重要功能。

同样,前面是正则表达式,用户分析用户的除了主域名nbphp.com之外的URL ,^(.*)$的意思就是所有的内容。 然后空格后面写的是我们引导用户访问的目录,我们带着他走到新的一个域名上。$1 指的是前面括号里匹配url所得到的内容。

这样就是一个完整的小例子。关于RewriteCond里 如何调用url的某个部分,我们可以参考这篇文章(Apache的Mod_rewrite学习 (RewriteCond重写规则的条件);

三、现学现用,学习正则表达式。

推荐一个经典的教程: 正则表达式30分钟入门教程

这个教程的确很简单,看完基本上写一些简单的正则就没有问题了。正则是一个需要长期使用的工具,隔段时间不用会忘记,所以我每次都看一遍这个教程。其实学过之后重要的就是一点内容。我简单罗列了如下:

.  换行符以外的所有字符

\w 匹配字母或数字或下划线或汉字

\s 匹配任意的空白符

\d 匹配数字

\b 匹配单词的开始或结束

^ 匹配字符串的开始

$ 匹配字符串的结束

* 重复零次或更多次

* 重复零次或更多次

+ 重复一次或更多次

? 重复零次或一次

{n} 重复n次

{n,}重复n次或更多次

{n,m} 重复n到m次

应用替换时,前面第一个()中匹配的内容后面就用$1引用,第二个()中匹配的就用$2应用……

推荐一个实用的正则在线测试网站 http://www.regextester.com/

我们来分析一下 discuz7.0 搜索引擎优化 htaccess 里面的重写。

RewriteRule ^forum-([0-9]+)-([0-9]+)\.html$  forumdisplay.php?fid=$1&page=$2

首先加入用户通过 nbphp.com/forum-2-3.html 访问discuz论坛,那么先通过.htaccess过滤,看看是否需要.htaccess引导一下用户,如果满足列出的一系列RewriteCond的条件那么就进行重写,discuz的没有列出RewriteCond 所以应该全部都进行重写。所以开始进行转写,forum-2-3.html 这个正好符合 列出的^forum-([0-9]+)-([0-9]+)\.html$ 正则表达式。并且 $1 为 2  ,$2为3 ,所以代入后面,即 forumdisplay.php?fid=2&page=3 加上前面的RewriteBase 指定的文件目录,那么就带他到制定目录的forumdisplay.php?fid=2&page=3 。

四、常见的.htaccess应用举例(部分例子引自四个例子实战讲解.htaccess文件rewrite规则)

4.1防止盗链,如果来得要访问jpe jpg bmp png结尾的url 用户不是来自我们的网站,那么让他看一张我们网站的展示图片。

RewriteEngine On

RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]

RewriteCond %{HTTP_REFERER} !^$

RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]

4.2 网站升级的时候,只有特定IP才能访问,其他的用户将看到一个升级页面

RewriteEngine on

RewriteCond %{REQUEST_URI} !/upgrade.html$

RewriteCond %{REMOTE_HOST} !^24\.121\.202\.30

RewriteRule $ http://www.nbphp.com/upgrade.html [R=302,L]

4.3把老的域名转向新域名

# redirect from old domain to new domain

RewriteEngine On

RewriteRule ^(.*)$http://www.yourdomain.com/$1[R=301,L]

五、一些其他功能

5.1 引出错误文档的目录

ErrorDocument 400 /errors/badrequest.html

ErrorDocument 404   http://yoursite/errors/notfound.html

ErrorDocument 401 “Authorization Required

5.2 Blocking users by IP 根据IP阻止用户访问

order allow,deny

deny from 123.45.6.7

deny from 12.34.5. (整个C类地址)

allow from all

5.3 防止目录浏览

# disable directory browsing

Options All -Indexes

5.4设置默认首页

# serve alternate default index page

DirectoryIndex about.html

5.5 把一些老的链接转到新的链接上——搜索引擎优化SEO

Redirect 301 /d/file.htmlhttp://www.htaccesselite.com/r/file.html

5.6为服务器管理员设置电子邮件。

ServerSignature EMail

SetEnv SERVER_ADMINdefault@domain.com

总结:

本文章主要介绍了应用最广最实用的重写功能,记住.htaccess的权限要设置成644,但愿对您有所帮助,当然本文肯定有介绍不到位的地方,望指正,谢谢!

时光传送带

重写的传送指引作用


windows和ubuntu开启rewrite模块使用.htaccess

windows中开启rewrite模块:

一、打开apapche2的配置文件,http.conf(可以从开始目录找到或者到安装目录找到)

找到LoadModule rewrite_module modules/mod_rewrite.so这行,将前面的注释符号“#”去掉;

如果没有这行,可以添加上。

并确认apache安装目录下的modules文件夹中是否有mod_rewrite.so这个文件,若没有这个文件,可以到网上下载。

二、添加好模块好,启用。

还是在http.conf 文件中,查到<Directory   ,

找到网站目录配置点,形如:<Directory “E:/wwwroot”>

闭合标签内有一项默认是:AllowOverride None

将其改成 AllowOverride All 即可。

三、右击计算机 管理 服务  重启Apache服务,rewrite生效。

ubuntu中开启rewrite模块

一、在终端执行 :sudo a2enmod rewrite    显示ok 即启用了该模块。

     或者,做个软链接:

sudo ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load

二、和windows一样开启这个模块。

这个配置文件比较隐藏,/etc/apache2/sites-enabled/000-default

我们可以通过 sudo gedit /etc/apache2/sites-enabled/000-default 来修改,找到 网站目录节点的那一行:

将其中的:AllowOverride None

修  改  为:AllowOverride All

三、重启:终端运行  sudo /etc/init.d/apache2 restart

静态之母

url重写工具