URL模块重写

时间:2015-03-13 17:30:41

标签: .htaccess mod-rewrite url-rewrite-module

我想mod_rewrite这个Url:

之前:

website.altervista.org/page.php?name=value

后:

website.altervista.org/value

1 个答案:

答案 0 :(得分:1)

<强>解决方案:

RewriteCond %{REQUEST_URI} !page.php$
RewriteRule ^(.+)$ /page.php?name=$1 [L]

说明:

mod_rewrite RewriteRule有3个参数:

  1. 模式
  2. 换人
  3. 标志
  4. 如此实施:

    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个参数:

    1. 测试字符串
    2. 条件模式
    3. 标志(可选)
    4. 测试字符串可以从几个来源派生。通常,与当前请求相关的服务器变量在此处用作此条件的主题。

      条件模式同样是文本或正则表达式,但还有一些可以评估的特殊条件。请阅读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}!$结束。如果此条件为真,请继续执行下一个条件或规则。如果此条件不成立,请跳过此规则集并继续下一个规则集。