php - Mod_rewrite 和不同顺序的多个变量

标签 php .htaccess mod-rewrite redirect seo

我是 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,但有些部分对我来说仍然是个谜(我想这就是谷歌想要的向导! )

最佳答案

从 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

并处理filterstr像这样在 PHP 中解析:

$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'];
    }
}

这应该使这个 url:

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

output:

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

想法是第一个之后的每个 url 段都是 /<name>-<value>/一对 <name>不能包含 -/ , 和 <value>不能包含 /

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

关于php - Mod_rewrite 和不同顺序的多个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11689307/

相关文章:

.htaccess - 如何在htaccess中将新域重定向到旧域的子页面

apache - .htaccess 删除 .html 并强制重定向到无扩展名的 url

javascript - 需要删除一个 P 类(无法在代码中删除它)

javascript - 如何使用PHP代码登录Linux服务器?

php - Laravel 4.2 中路由的 HTTPS 错误 - Assets 通过 HTTPS 加载正常

.htaccess 仅在 safari 上导致重定向循环 - http 到 https

regex - 与 mod_rewrite 斗争

.htaccess - 允许/拒绝使用 .htaccess 进行图像热链接

php - MYSQL 将两列与一列连接并获取数据

php - 正则表达式解析youtube yid