0

我有一个 php 页面,它创建如下 URL:

vendors/London City/cat-DJ & Entertainment/keywords

我的 .htaccess 重定向如下所示

RewriteRule vendors/(.+)/cat-(.+)/(.+)$ vendors.php?location=$1&category=$2&freetext=$3 [L]
RewriteRule vendors/(.+)/cat-(.+)/(.+)/$ vendors.php?location=$1&category=$2&freetext=$3 [L]

问题 1 是:在 vendor.php 文件中,我只得到“DJ ; Entertainment”作为类别。& 符号丢失。

问题 2是:我的完整 .htaccess 文件如下所示......定义了6 条规则

RewriteRule vendors/(.+)/(.+)/$ vendors.php?location=$1&freetext=$2 [L] 
RewriteRule vendors/(.+)/(.+)$  vendors.php?location=$1&freetext=$2 [L]
RewriteRule vendors/(.+)/cat-(.+)/$ vendors.php?location=$1&category=$2 [L]
RewriteRule vendors/(.+)/cat-(.+)$  vendors.php?location=$1&category=$2 [L]
RewriteRule vendors/(.+)/cat-(.+)/(.+)$ vendors.php?location=$1&category=$2&freetext=$3[L]
RewriteRule vendors/(.+)/cat-(.+)/(.+)/$ vendors.php?location=$1&category=$2&freetext=$3[L]

为什么 URL vendor/London City/cat-DJ & Entertainment/keywords与规则 3 或 4 匹配并重定向到 vendor.php?location=$1&category=$2 ?

.htaccess 会从头到尾一一处理规则吗?

我通过将规则 5 和 6 放在其他规则的顶部解决了这个问题。我做了正确的修复吗?

4

2 回答 2

0

1.我不太喜欢在 URL 中包含空格和其他特殊字符的想法。我不知道您的网站是否可以,但不要使用这种 URL

vendors/London City/cat-DJ & Entertainment/keywords

你应该有这个:

vendors/london-city/cat-dj-and-entertainment/keywords

当然,为此,您必须在数据库中执行一些额外的转换/查找才能转换london-cityLondon City和转换dj-and-entertainmentDJ & Entertainment. 这可以通过将这些“从-到”对存储在数据库中来完成。

2.无论如何——规则的顺序很重要。因此,您应该从更具体的规则开始,并以更通用的规则结束。

另外 -(.+)模式太宽泛了,因为它可以hello匹配hello/pink/kitten. 为了确保您始终只抓取一个部分(之间的 URL 的一部分/),请改用([^/]+)模式 - 这将解决您的“问题 #2”的一个方面。

因此,请尝试这些优化规则(每个规则将匹配带有和不带有斜杠的 URL):

RewriteRule ^vendors/([^/]+)/cat-([^/]+)/([^/]+)/?$ vendors.php?location=$1&category=$2&freetext=$3 [L]
RewriteRule ^vendors/([^/]+)/cat-([^/]+)/?$ vendors.php?location=$1&category=$2 [L]
RewriteRule ^vendors/([^/]+)/([^/]+)/?$ vendors.php?location=$1&freetext=$2 [L] 

此外,我没有使用 URL 中给出的 & 符号获得“类别”的值。我得到的只有分号。可能是什么原因?

我旁边没有当前运行的 Apache 框,所以现在无法检查它,但尝试在标志旁边添加B或标记(例如)——其中一个应该有帮助:NEL[L,B]

于 2011-11-26T11:28:41.320 回答
0

文档

定义这些规则的顺序很重要——这是它们在运行时应用的顺序。

于 2011-11-26T08:26:41.950 回答