【问题标题】:Mod_rewrite and multiple variable in different orderMod_rewrite 和不同顺序的多个变量
【发布时间】:2012-07-26 05:17:54
【问题描述】:

我是 StackOverflow 的新手,所以我会尽我所能,尽可能地清楚。我正在重写我的 URL 以对 SEO 更友好,所以我研究了 mod_rewrite 并认为这可能是最好的方法。我正在开发一个电子商务网站(这个细节稍后会很重要)。 因此,对于像/about_us.php 这样的简单页面,重定向非常容易。

RewriteEngine on 
RewriteBase /

RewriteRule ^about-us/$ /about_us.php

我想我们都同意这一点。当我尝试在过滤器页面上重写 URL 时出现问题。所以在像

这样的页面上
example.com/examplefile.php?filter1=a&filterb=2&filterc=3

重定向仍然很容易。 (注意:我选择在值前写“filter1”)

RewriteRule ^/products/filter1-([-a-zA-Z0-9]+)/filter2-([-a-zA-Z0-9]+)/filter3-([-a-zA-Z0-9]+)/$ /examplefile.php?filter1=$1&filterb=$2&filterc=$3 

这是我偶然发现的部分:假设过滤器的顺序可能不同

example.com/examplefile.php?filterb=2&filter1=a&filterc=3

我不会在.htaccess 中写下所有可能性,因为我有 6 个不同的过滤器,而且您可以使用 1、2、3... 到 6 个过滤器,无论是否有序,它都是.. . 很多可能性(我会让你做数学;))。

你有任何关于 mod_rewrite 的解决方案,或者有其他的解决方案吗?我正在考虑 301 重定向,但我担心的是链接将如何出现在搜索引擎中。我正在着手 SEO,但有些部分对我来说仍然是一个谜(我想这就是 Google 想要的向导! )

【问题讨论】:

    标签: php .htaccess mod-rewrite redirect seo


    【解决方案1】:

    从 SEO 的角度来看,您不应该有多个具有相同内容的 URl,因此如果它们给出相同的结果,您不应该在网站上创建像 /filter1-42/filter2-42//filter2-42/filter1-42/ 这样的链接(canonical url 链接标签可能会有所帮助带有链接到您网站的外部资源)。

    编辑:从模式中删除了“过滤器”,使其更通用。

    我会把问题分成两半,然后RewriteRule

    RewriteRule ^/products/((?:[a-zA-Z0-9]+-[-a-zA-Z0-9]+/?)*) /products.php?filterstr=$1
    

    并像这样处理 php 中的 filterstr 解析:

    $filters = array();
    $filterparts = explode('/', trim(isset($_GET['filterstr']) ? $_GET['filterstr'] : '', '/'));
    foreach ($filterparts as $filter) {
        if (preg_match('/(?<key>\w+)-(?<value>[-a-z0-9]+)/i', $filter, $m)) {
            $filters[$m['key']] = $m['value'];
        }
    }
    

    这应该是这个网址:

    http://example.com/products/language-france-and-stuff/filtera-42/filter1-42/filterb-42/

    输出:

    array(4) { 'language' => string(6) "france" 'filtera' => string(2) "42" 'filter1' => string(2) "42" 'filterb' => string(2) "42" }  
    

    想法是,第一个之后的每个 url 段都是 /&lt;name&gt;-&lt;value&gt;/ 对,其中 &lt;name&gt; 不能包含 -/&lt;value&gt; 不能包含 @987654335 @

    将该模式复制到您需要的每一个地方,如果您需要它说 10 个地方,它将创建一个维护地狱,所以在这一点上,我将尝试为整个参数处理引入一些结构并创建一个 front controller,这将解析整个$_SERVER['REQUEST_URI'] 并选择控制器并以某种标准方式将参数传递给它,因此您的.htaccess 中只需要一个RewriteRule,其他一切都取决于应用程序(为了获得额外的好处,它更容易在那里调试)。

    【讨论】:

    • 是的,我就是这么想的。我会尝试您的解决方案并随时为您更新。谢谢!
    • 另一个问题,用你的方法,是否可以将我的数据库链接到 URL,即如果我有(例如)country=5 但我想显示 /country-france
    • 编辑:你的第 2 行有错字 $filterparts = explode('/', trim(isset($_GET['filterstr']) ? $_GET['filterstr'] : '' ));
    • 修正了错字,并通过添加前端控制器脚注使解决方案更加通用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 2011-04-04
    • 1970-01-01
    相关资源
    最近更新 更多