繁体   English   中英

PHP和Apache-解析mod_rewrite网址

[英]PHP & Apache - parse mod_rewrite url

我将服务器的apache配置为将每个请求重定向到index.php,以便可以使用以下网址:

http://www.website.com/about/us

现在,我需要解析url以确定每个路由是否存在以及从中可以得到什么,因此我可以设置一个数据库表来保存路由,以便我的客户可以按自己的意愿编辑其路由。 事情是,到目前为止,我还无法解析。

这是我的代码:

$uri = 'about/us';
$regex = '(page(/<action>))';
if ( ! preg_match($regex, $uri, $matches)) {
    echo 'the route doesn\'t match';
    exit();
}

它总是显示该回显消息。 我究竟做错了什么?

编辑:

我需要正则表达式的原因如下。 假设我有一个网址段,例如:

/user/yoda

这里的正则表达式对于将第一个参数解析为一个动作或页面很有用,而第二个参数解析为只允许一组特定字符的键,例如,如果我希望在这种情况下,第二个参数仅匹配“ _-azAZ09”,像这样。 换句话说,我将把regex表达式集与uri进行比较,以确定它们中的任何一个是否与uri匹配,并确定从那以后要采取的措施。 使用explode函数会使我稍后在代码中评估uri段,但要避免。 如果找不到与uri匹配的内容,请立即将页面转发到404页面,然后中断操作。 不知道我是否说清楚了..

为什么不简单地拆分传入的URI,而不使用正则表达式?

$uri = 'about/us';
list($page, $action) = explode('/', $uri);

如果需要两个以上,只需删除列表:

$pagePath = explode('/', $uri);

但是,如果您坚持使用正则表达式,则可以这样做:

$regex = '#(?P<page>.*)/(?P<action>.*)#';

但是,它没有为您提供什么特别的功能,只是$ matches现在将包含$matches['page']$matches['action'] -但是,如果您确实需要它,可以使用如上所示的list()


使用explode函数将使我稍后在代码中评估uri段,但要避免

与其不通过字符集来确保该页面是有效的,何不编译一个有效页面查找表的列表,而只使用比正则表达式快得多的php in_array 将URL段提取到数组中将使您可以立即验证多维数组。

我认为正则表达式必须用符号包围; 例如'@(page(/<action>))@' 请参阅http://php.net/preg_match中的示例

如果出于某些原因绝对必须使用正则表达式,请尝试以下操作:

$uri = 'about/us';
$regex = '~(?<path>[^/]+)/(?<action>.+)~';
var_dump($matches);

哪个输出:

array(5) {
  [0]=>
  string(8) "about/us"
  ["path"]=>
  string(5) "about"
  [1]=>
  string(5) "about"
  ["action"]=>
  string(2) "us"
  [2]=>
  string(2) "us"
}

但是,这仅在路径组件仅下降一级时才有效!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM