PHP 和 Apache - 解析 mod_rewrite url

标签 php apache mod-rewrite preg-match

我将服务器的 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();
}

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

编辑:

我需要正则表达式的原因如下。想象一下我有一个像这样的 url 段:

/user/yoda

这里的正则表达式可用于将第一个参数解析为操作或页面,将第二个参数解析为仅允许特定字符集的键,就像我想要期望的那样,在本例中,第二个参数仅匹配“_-azAZ09”,类似这样。换句话说,正则表达式集将与 uri 进行比较,以确定它们中是否有任何一个与 uri 匹配,并确定从此之后要采取的操作。使用爆炸函数将使我稍后在代码中评估 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() 如上所示。


Using the explode function would make me evaluate the uri segments later in the code, wich I'd like to avoid

与其通过字符集确保页面有效,为什么不编译有效页面查找表列表并仅使用 php 的 in_array ,它比正则表达式快得多?将 URL 段提取到数组中将使您能够立即验证多维数组。

关于PHP 和 Apache - 解析 mod_rewrite url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2214603/

相关文章:

php - <a> 不换行,显示为文本

java - 在 Java 中使用 Apache POI 读取上标 excel 文本

.htaccess - 为什么 RewriteCond %{HTTPS} 没有返回正确的值?

php - 如何在amazon linux中安装Php5.6

实例化时未调用 PHP 构造函数

php - Apache 无法使用 curl 发出传出 HTTP 请求

regex - 用 mod 重写删除尾部斜杠?

mod-rewrite - Amazon S3 上的 Mod_rewrite

php - 对多维数组进行排序的最佳方法

php - 我怎样才能检测到 "Slashdotted"并存活下来?