网址国防部重写
我要mod_rewrite的以下链接:网址国防部重写
前:
website.altervista.org/page.php?name=value
后:
website.altervista.org/value
解决方案:
RewriteCond %{REQUEST_URI} !page.php$
RewriteRule ^(.+)$ /page.php?name=$1 [L]
说明:
mod_rewrite的RewriteRule
有3个参数:
- 模式
- 换人
- 标志
实现为这样:
RewriteRule pattern substitution [flags]
始于服务器根,请在RewriteRule
“模式”参数所请求的URL的路径,并在“取代”参数所需的路径。在这种情况下:
RewriteRule ^(.+)$ /page.php?name=$1 [L]
如果URL变化,你不希望(或不能)编写规则每一种情况,然后使用正则表达式^(.+)$
捕捉动态值,并将其注入到您的替代路径使用RE捕获变量$1
。第一组圆括号是$1
,第二组是$2
等,并且可以嵌套捕获括号。
^(.+)$
这个正则表达式可以理解为:在字符串的开头^
,$
一路字符串的结尾,寻找.
任何字符+
一个或倍和()
捕获该值放入一个变量。
问题:
即使我们有标志[L]
(最后一条规则计算的),mod_rewrite的引擎(幕后)将新建成的请求/page.php?name=somevalue
回到通过mod_rewrite的引擎,直到没有规则或者显然,请求没有变化。幸运的是,有一个支持指令来扩展RewriteRule
提供的条件性能RewriteCond
。
mod_rewrite的RewriteCond
适用于下一个出现的RewriteRule
并且还具有3个参数:
- 测试字符串
- 条件模式
- 标志(可选)
测试字符串可以来自几个来源。通常,与当前请求相关的服务器变量在此用作此情况的主题。
条件模式又是文本或正则表达式,但有一些额外的特殊条件可以评估。详细解释请阅读Apache online mod_rewrite documentation。
在这种情况下:RewriteRule ^(.+)$ /page.php?name=$1 [L]
,我们刚刚取代请求通过了mod_rewrite送回为/page.php?name=somevalue
和我们的“无所不包”的规则,因此我们原来的“someValue中”消失,并与我们的新请求的资源page.php
更换相匹配。为了防止我们的“全部抓住”捕捉我们的“page.php”请求,让我们使用RewriteCond
从规则中排除它。
RewriteCond %{REQUEST_URI} !page.php$
RewriteRule ^(.+)$ /page.php?name=$1 [L]
这RewriteCond
可以理解为:%{REQUEST_URI}
获得所请求的资源,并且做得非常!
不$
结束与page.php
。如果这种情况属实,继续下一个条件或规则。如果此条件不成立,请跳过此规则集并继续到下一个规则集。