apache .htaccess中的多连字符处理(URL重写)

gjmwrych  于 2023-01-14  发布在  Apache
关注(0)|答案(1)|浏览(154)

它给我的网址如下: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']];
?>

出现错误

uoifb46i

uoifb46i1#

$seo_keys = array(
'service'=> 'Service',  
'new-service'=> 'New Service'
);
$seo_places = array(
'brussels'=>'Brussels',
'new-york'=>'New York'
);

这个问题在当前的形式下是无法解决的,因为“keys”和“places”都可以包含连字符,并且您在“keys”和“places”之间使用的分隔符也是连字符。因为使用简单的模式匹配无法解析/key-place/key-place-place/key-key-place(在.htaccess中),而不预先知道现有的 * 键 * 和 * 位置 *。(稍后需要在PHP代码中通过搜索数组(或数据库)中的有效键/位置来解析它,这是低效的,并且如果“键”和“位置”碰巧重叠,例如/one-two-three,其中one-two是“键”,但是two-three是“位置”,则仍然可能潜在地导致冲突。

RewriteRule ^([a-zA-Z0-9-éçèà]+)-([a-zA-Z0-9-éçèà]+)$ ....

请注意,regex字符类中的文字连字符需要是第一个或最后一个字符,或者需要进行反斜杠转义以否定其特殊含义(作为 range 说明符)。
还要注意这个正则表达式不允许尾部斜杠,所以它看起来不匹配你的示例URL(包括尾部斜杠)--这将导致404,因为规则不会做任何事情。
不过,我怀疑(如果第一个例子的URL有效,而第二个例子没有)那么你的“错误”是一个由PHP生成的E_NOTICE,由于一个“未定义的索引”。这是因为正则表达式默认是 greedy,所以上面的正则表达式会分别返回service-newyork给你的“key”和“place”,而它们在你的查找数组中并不存在。这里你需要更健壮的错误检查,因为你接受原始的用户输入(URL),所以这些“错误”是不可避免的。

溶液

这里最简单的/合乎逻辑的解决方案是使用不同的字符作为分隔符,如斜杠,这样您将得到以下形式的URL:

http://localhost/service/brussels/
http://localhost/service/new-york/

“keys”和“places”不能包含斜线,所以这就避免了明显的歧义。
.htaccess中的规则将变为:

RewriteRule ^([a-zA-Z0-9éçèà-]+)/([a-zA-Z0-9éçèà-]+)/$ cities.php?key=$1&place=$2 [L]

请注意,这会强制在请求的URL上使用尾部斜杠。如果希望尾部斜杠是可选的(尽管只有一个URL应该是规范的),则应实现附加重定向以重定向到规范的URL(使用或不使用尾部斜杠)。

  • 旁白:* 只是一个观察,但你的“键”似乎是小写的,但你允许大写字母在正则表达式?

类似/相关问题:

相关问题