【问题标题】:URL rewriting advice please请提供 URL 重写建议
【发布时间】:2011-12-24 11:37:35
【问题描述】:

我想让我的网址对 seo 更友好,例如改变这个:

http://www.chillisource.co.uk/product?&cat=Grocery&q=Daves%20Gourmet&page=1&prod=B0000DID5R&prodName=Daves_Insanity_Sauce

像这样的好东西:

http://www.chillisource.co.uk/product/Daves_Gourmet/Daves_Insanity_Sauce

这样做的最佳方法是什么?我已经看过使用 htaccess 文件执行此操作,但这似乎非常复杂。

提前致谢

【问题讨论】:

  • 您的原始网址包含的参数比您的重写版本更多...
  • .htaccess 是这样做的正确方法。所以把你的头绕回那个复杂性:)实际上,它只是正则表达式。

标签: php apache url-rewriting


【解决方案1】:

Ben Paton,其实有一个非常简单的出路。像 Wordpress 这样的 CMS 倾向于使用它而不是使用正则表达式。


.htaccess

首先,您使用具有以下内容的 .htacess:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.php [L]
</IfModule>

让我解释一下它的作用(逐行):

  • 如果名为 mod_rewrite 的 apache 模块存在。
    • 打开模块
    • 让我们知道我们将在 域名(只重写部分目录,使用RewriteBase /subdir/
    • 如果请求的路径不作为文件存在...
    • 它甚至不作为目录存在...
    • “重定向”请求到 index.php 文件
  • 关闭我们的模块条件

以上只是一个简单的解释。你真的不需要它来使用它。

我们所做的是,我们告诉 Apache 所有最终会以 404 结尾的请求将它们传递到 index.php 文件,我们可以在其中手动处理请求。


PHP 方面

在 PHP 方面,在 index.php 中,您只需解析原始 URL。此 URL 在 $_SERVER 变量中作为 $_SERVER['REDIRECT_URL'] 传递。

最好的部分,如果没有重定向,这个变量就没有设置!

所以,我们的代码最终会是这样的:

if ( isset( $_SERVER['REDIRECT_URL'] ) ) {

    $url = explode('/', $_SERVER['REDIRECT_URL'] );

    switch($url[0]){
        case 'home': // eg:    /home/
            break;
        case 'about': // eg:    /about/
            break;
        case 'images': // eg:    /images/
            switch( $url[1] ){
                case '2010': // eg:    /images/2010/
                    break;
                case '2011': // eg:    /images/2011/
                    break;
            }
            break;
    }

}

轻松集成

我差点忘了提及这一点,但是,由于它的工作方式,您甚至可以完全不更改现有代码!

少说话,多举例。假设您的代码如下所示:

<?php

    $page = get_page($_GET['id']);
    echo '<h1>'. $page->title .'</h1>';
    echo '<div>'. $page->content .'</div>';

?>

适用于以下网址:

index.php?id=5

您可以使其与 SEO URL 一起使用,同时与旧系统保持一致。首先,确保.htaccess 包含我在上面写的代码。

接下来,在文件的最开头添加以下代码:

if ( isset( $_SERVER['REDIRECT_URL'] ) ) {

    $url = explode('/', $_SERVER['REDIRECT_URL'] );
    $_GET['id'] = $url[0];

}

我们在这里做什么?在编写两个您自己的代码之前,我们基本上是从旧 URL 中查找 ID 和信息,并将其提供给 PHP 的 $_GET 变量。 我们实际上是在愚弄您的代码,以为请求具有这些变量!

唯一剩下的障碍就是找到所有那些讨厌的&lt;a/&gt; 标签并相应地替换它们的href,但这是另一回事。 :)

【讨论】:

    【解决方案2】:

    我必须补充一点:在您的原始网址中,有一个“prod”键,它似乎包含一个 ID。 确保在切换到重写的 url 时,您不再仅仅依赖于唯一的 id,因为它在 url 中不可见。 现在,您可以使用ID来区分2个同名的产品,但是在重写url并且在url中不再需要ID的情况下,您需要确保1个产品名称不能多次用于不同的产品产品。 同样,我看到所需的输出 url 中不存在“cat”键,与上述相同。

    忽略上述“问题”,重写大致如下:

    RewriteRule ^/product/(.*?)/(.*?)$ /product?&cat=Grocery&q=$1&page=1&prod=B0000DID5R&prodName=$2
    

    q & prodName 将收到带下划线的值,而不是 %20,因此这也需要一些补丁。 如您所见,我没有触摸 id 和类别,这将由您来决定如何处理。

    【讨论】:

      【解决方案3】:

      尝试这样的事情

      RewriteRule ^/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)  /$1.php?id1=$2&id2=$3 [QSA]
      

      然后使用$_GET获取参数值...

      【讨论】:

      • 非常适合维护者的噩梦 :)
      【解决方案4】:

      它叫做 mod_rewrite,这里有一个教程:

      http://www.workingwith.me.uk/articles/scripting/mod_rewrite

      【讨论】:

      • 教程很棒,但还不够。它也没有让任何事情变得更容易,而是最终变成了意大利面条代码。 +1 表示教程,-1 表示不实用。 :)
      【解决方案5】:

      如何使用PATH_INFO 环境变量?

      $path=explode("/",getenv("PATH_INFO"));
      echo($path[0]."; ".$path[1] /* ... */);
      

      会输出

      product; Daves_Gourmet; Daves_insanity_Sauce
      

      从使用$_GET 到使用PATH_INFO 环境的转换是一个很好的编程练习。我认为你不能只通过配置来完成任务。

      【讨论】:

        猜你喜欢
        • 2012-12-19
        • 1970-01-01
        • 2021-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多