我有一个创建URL的php页面:
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]
在vendor.php文件中问题1是,我只将“DJ;娱乐”作为类别。 &符号丢失。
问题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]
为什么网址供应商/伦敦城市/ cat-DJ&娱乐/关键字符合规则3或4并重定向到vendors.php?location = $ 1& category = $ 2?
.htaccess是一个一个地从上到下处理规则吗?
我通过将规则5和6放在其他规则的顶部来解决问题。我做了正确的修复吗?
答案 0 :(得分:0)
来自the docs:
定义这些规则的顺序很重要 - 这是它们在运行时应用的顺序。
答案 1 :(得分:0)
1。我不太喜欢在网址中包含空格和其他特殊字符的想法。我不知道您的网站是否可以使用,而不是这种网址
vendors/London City/cat-DJ & Entertainment/keywords
你应该有这个:
vendors/london-city/cat-dj-and-entertainment/keywords
当然,为此,您必须在数据库中执行一些额外的转换/查找,以将london-city
转换回London City
并将dj-and-entertainment
转换回DJ & Entertainment
。这可以通过存储这些"从 - 到"数据库中的对。
2。无论如何 - 规则的顺序很重要。因此,您应该从更具体的规则开始,最终得到更通用的规则。
此外 - (.+)
模式过于宽泛,因为它可以匹配hello
以及hello/pink/kitten
。为了确保您始终只抓取一个部分(/
之间的网址的一部分)而使用([^/]+)
模式 - 这将解决您的问题#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]
此外,我还没有获得'类别'的价值。用&符号作为 在网址中给出。我只得到了分号。什么可以 原因是什么?
我目前没有运行Apache框,因此无法立即检查,但尝试在B
标记旁边添加NE
或L
标记(例如{{ 1}}) - 其中一个应该有所帮助: