UrlRewriting规则不起作用

时间:2012-03-26 16:36:44

标签: php apache .htaccess

我有以下PHP代码:

   <?php  
    if(isset($_GET['article']))
    {
        echo "<b>success</b>";
    }
 ?>

这个html:

<a href="http://localhost/PHPTest/index.php?article_27" >Click me</a>

我想找出自己的网址。

通过这样做,我尝试使用mod_rewrite()。这就是我的.htaccess:

RewriteEngine On
RewriteBase /PHPTest/

RewriteRule ^article_([0-9]+)$ index.php?article=$1

正如你所看到的,我试图让文章得到变量..

然而这不起作用..例如,htaccess不理解artcile_27,因为文章= 27 ..

为什么?

应该发生的是,只要我按下链接,就应该打印成功词。问题是它没有。

3 个答案:

答案 0 :(得分:2)

您编写的规则与链接http://localhost/PHPTest/article_27匹配,如果您确实希望匹配网址http://localhost/PHPTest/index.php?article_27(至少在我的竞争中,这是一个不寻常的网址),正确的重写规则如下:

RewriteRule ^index\.php\?article_([0-9]+)$ index.php?article=$1

你必须在最后一次斜线后查看整个部分。

答案 1 :(得分:1)

打开:http://localhost/PHPTest/article_27

如果有效,则表示您的重写有效。在这种情况下,您所要做的就是更改HTML:

<a href="http://localhost/PHPTest/index.php?article_27" >Click me</a>

应该是:

<a href="http://localhost/PHPTest/article_27" >Click me</a>

或者更确切地说,只是:

<a href="/PHPTest/article_27" >Click me</a>

这使您的代码更容易移植到另一个主机名,端口,协议......

答案 2 :(得分:1)

你的规则应该是:

RewriteRule ^index.php?article_([0-9]+)$ index.php?article=$1

但是,我会以这种方式质疑mod_rewrite的用法。

首先,如果您的网址始终只是index.php?article_27,那么您可以使用$_SERVER['QUERY_STRING']直接访问“article_27”,而无需使用mod_rewrite。

如果您要使用mod_rewrite,为什么不将您的网址设为/PHPTest/article/27

RewriteRule ^article/([0-9]+) index.php?article=$1

以上也允许/PHPTest/article/27/title_of_article_here,这会给你两件好事:ID仍然存在,因此很容易检索服务器端,名称在URL中,所以很高兴读作人类并帮助搜索引擎。如果你现在查看你的URL栏,你会发现stackoverflow本身使用这种方法。