PHP与Apache - 解析URL的mod_rewrite
-
19-09-2019 - |
题
我在我的服务器的apache的配置为重定向每个请求到index.php中,这样我可以使用像网址:
http://www.website.com/about/us
现在我需要解析的网址,以确定每个路由且从它会发生什么,所以我可以设置一个数据库表来保存路径等我的客户可以编辑自己的路线,因为他们喜欢他们是。事情是,我不能做解析为止。
下面是我的代码:
$uri = 'about/us';
$regex = '(page(/<action>))';
if ( ! preg_match($regex, $uri, $matches)) {
echo 'the route doesn\'t match';
exit();
}
它总是会出现在该回声消息。我在做什么错了?
编辑:
为什么我需要正则表达式的原因是如下。想象我有一个URL段,如:
/user/yoda
这里的正则表达式将是有益的解析第一个参数作为一个动作或网页,第二作为重点,将只允许一组特定的字符的,就像如果我想期待,在这种情况下,第二paramenter只有符合“_-azAZ09”,这样的事情。换句话说,一组正则表达式将我相比URI,以确定是否有任何他们的URI相匹配,并确定行动从承担。使用爆炸功能会让我评价后面的代码中的URI段,至极我想避免。如果没有匹配的URI,immediatelly页前进到404一个,打破了操作。不知道我说清楚了..
解决方案
除了使用正则表达式,为什么不能简单地分割输入的URI的?
$uri = 'about/us';
list($page, $action) = explode('/', $uri);
如果您需要两个以上时,只要将名单:
$pagePath = explode('/', $uri);
但是,如果你的坚持的使用正则表达式,这是不行的:
$regex = '#(?P<page>.*)/(?P<action>.*)#';
然而,你提供什么特别的不同之处在于$比赛现在将包含$matches['page']
和$matches['action']
- 但如果你真的需要它,如上图所示你可以横置list()
使用爆炸功能将使 后来在我的评价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"
}
然而,当路径组件仅下降一个等级,这只会工作!