我想mod_rewrite这个Url:
之前:
website.altervista.org/page.php?name=value
后:
website.altervista.org/value
答案 0 :(得分:1)
<强>解决方案:强>
RewriteCond %{REQUEST_URI} !page.php$
RewriteRule ^(.+)$ /page.php?name=$1 [L]
说明:
mod_rewrite RewriteRule
有3个参数:
如此实施:
RewriteRule pattern substitution [flags]
从服务器根开始,在RewriteRule
&#34;模式&#34;中输入请求的URL路径。参数,以及&#34;替换中的所需路径&#34;参数。在这种情况下:
RewriteRule ^(.+)$ /page.php?name=$1 [L]
如果网址发生变化且您不想(或无法)为每种情况编写规则,请使用正则表达式^(.+)$
捕获动态值并将其注入您的使用RE捕获变量$1
替换路径。第一组括号为$1
,第二组为$2
等。捕获括号可以嵌套。
^(.+)$
此正则表达式可以在字符串的开头读取为:^
,$
一直到字符串的结尾,查找.
任何字符+
一次或多次()
将该值捕获到变量中。
问题:
即使我们有标志[L]
(评估的最后一个规则),mod_rewrite引擎(在幕后)通过mod_rewrite引擎发回新构造的请求/page.php?name=somevalue
,直到没有满足规则,或者显然,请求没有变化。幸运的是,有一项免费指令可以扩展名为RewriteRule
的{{1}}提供的条件权力。
mod_rewrite RewriteCond
适用于下一个RewriteCond
,还有3个参数:
测试字符串可以从几个来源派生。通常,与当前请求相关的服务器变量在此处用作此条件的主题。
条件模式同样是文本或正则表达式,但还有一些可以评估的特殊条件。请阅读Apache online mod_rewrite documentation以获取详细说明。
在这种情况下:RewriteRule
,我们新替换的请求将通过mod_rewrite作为RewriteRule ^(.+)$ /page.php?name=$1 [L]
发回,并匹配我们的&#34; catch-all&#34;规则,因此我们原来的&#34; somevalue&#34;丢失并替换为我们新请求的资源/page.php?name=somevalue
。为了防止我们的所有&#34;赶上所有&#34;从捕捉我们的&#34; page.php&#34;请求允许我们使用page.php
将其排除在规则之外。
RewriteCond
此RewriteCond %{REQUEST_URI} !page.php$
RewriteRule ^(.+)$ /page.php?name=$1 [L]
可以理解为:RewriteCond
获取所请求的资源,%{REQUEST_URI}
非!
以$
结束。如果此条件为真,请继续执行下一个条件或规则。如果此条件不成立,请跳过此规则集并继续下一个规则集。