Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Mod_重写和不同顺序的多变量_Php_.htaccess_Mod Rewrite_Redirect_Seo - Fatal编程技术网

Php Mod_重写和不同顺序的多变量

Php Mod_重写和不同顺序的多变量,php,.htaccess,mod-rewrite,redirect,seo,Php,.htaccess,Mod Rewrite,Redirect,Seo,我是StackOverflow的新手,所以我会尽我最大的努力让自己尽可能清楚。我正在重写我的URL以使其对SEO更加友好,所以我研究了mod_rewrite,认为这可能是最好的方法。我在一个电子商务网站上工作(这个细节稍后会很重要)。 因此,对于像/about_us.php这样的简单页面,重定向非常容易 RewriteEngine on RewriteBase / RewriteRule ^about-us/$ /about_us.php 我想我们都同意这一点。当我试图重写过滤器页面上的U

我是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”)

这是我偶然发现的一部分:比方说,过滤器的顺序可能不同

example.com/examplefile.php?filterb=2&filter1=a&filterc=3
不可能,我将在
.htaccess
中编写所有的可能性,因为我有6个不同的过滤器,您可以使用1,2,3。。。到6个过滤器,有序与否,它是。。。有很多可能性(我让你做数学题)


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

从搜索引擎优化的角度来看,你不应该有多个相同内容的URL,因此,如果网站上的
/filter1-42/filter2-42/
/filter2-42/filter1-42/
具有相同的结果,则不应在网站上创建链接(链接标签可能有助于外部源链接到您的网站)

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

我将把问题一分为二,然后重写以下规则:

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'];
    }
}
其思想是,第一个url段之后的每个url段都是
/-/
对,其中
不能包含
-
/
,而
不能包含
/


将该模式复制到您需要的每一个地方会创建一个维护地狱,如果您需要的话,比如说10个地方,所以在这一点上,我将尝试为整个参数处理引入一些结构,并创建一个解析整个
$\u服务器['REQUEST\u URI']
并选择控制器,然后以某种标准方式将参数传递给它,因此您只需在
.htaccess
中使用一个
重写规则,其他一切都取决于应用程序(为了增加额外的好处,更容易在那里调试)。

是的,我就是这么想的。我将尝试您的解决方案,并让您不断更新。谢谢另一个问题是,使用您的方法,是否可以将我的DB链接到URL,例如,如果我有(例如)country=5,但我想显示/country franceedit:2$filterparts=explode('/',trim(isset($_GET['filterstr'])?$_GET['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" }