它给我的网址如下:http://localhost/service-brussels/
(服务是关键,brussels
是位置)。此URL工作完美。
但是,当我输入这个网址:http://localhost/service-new-york/
它不再工作了。问题的原因一定是这个地方包含几个连字符(new-york
),而第一个(brussels
)不包含连字符。
有人知道怎么解决这个问题吗?
RewriteRule ^([a-zA-Z0-9-éçèà]+)-([a-zA-Z0-9-éçèà]+)$ cities.php?key=$1&place=$2 [L] \ [R=302,L]
在Keys.php
中
<?php
$seo_keys = array(
'service'=> 'Service',
'new-service'=> 'New Service'
);
$seo_places = array(
'brussels'=>'Brussels',
'new-york'=>'New York'
);
?>
在cities.php
中
<?php
require_once('Keys.php');
$place=$seo_places[$_GET['place']];
$motCle=$seo_keys[$_GET['key']];
?>
出现错误
1条答案
按热度按时间uoifb46i1#
这个问题在当前的形式下是无法解决的,因为“keys”和“places”都可以包含连字符,并且您在“keys”和“places”之间使用的分隔符也是连字符。因为使用简单的模式匹配无法解析
/key-place
或/key-place-place
或/key-key-place
(在.htaccess
中),而不预先知道现有的 * 键 * 和 * 位置 *。(稍后需要在PHP代码中通过搜索数组(或数据库)中的有效键/位置来解析它,这是低效的,并且如果“键”和“位置”碰巧重叠,例如/one-two-three
,其中one-two
是“键”,但是two-three
是“位置”,则仍然可能潜在地导致冲突。请注意,regex字符类中的文字连字符需要是第一个或最后一个字符,或者需要进行反斜杠转义以否定其特殊含义(作为 range 说明符)。
还要注意这个正则表达式不允许尾部斜杠,所以它看起来不匹配你的示例URL(包括尾部斜杠)--这将导致404,因为规则不会做任何事情。
不过,我怀疑(如果第一个例子的URL有效,而第二个例子没有)那么你的“错误”是一个由PHP生成的E_NOTICE,由于一个“未定义的索引”。这是因为正则表达式默认是 greedy,所以上面的正则表达式会分别返回
service-new
和york
给你的“key”和“place”,而它们在你的查找数组中并不存在。这里你需要更健壮的错误检查,因为你接受原始的用户输入(URL),所以这些“错误”是不可避免的。溶液
这里最简单的/合乎逻辑的解决方案是使用不同的字符作为分隔符,如斜杠,这样您将得到以下形式的URL:
“keys”和“places”不能包含斜线,所以这就避免了明显的歧义。
.htaccess
中的规则将变为:请注意,这会强制在请求的URL上使用尾部斜杠。如果希望尾部斜杠是可选的(尽管只有一个URL应该是规范的),则应实现附加重定向以重定向到规范的URL(使用或不使用尾部斜杠)。
类似/相关问题: