[英]is there a PHP function to simulate how apache mod_rewrite works?
我很困在这里,所以我需要一个函数,或者一个创建函数的想法,以与Apache的mod_rewrite相同的方式工作。 它应该具有一个正则表达式,针对mod_rewrite的writt和URL。 应该返回从中提取的参数数组。
这是一个简短的示例,说明如何工作:
function rewrite($regexp, $url){
....
}
$params = rewrite('([^/]+)-([^/]+).html', 'Oval-Shape.html');
print_r($params);
上面的代码应打印:
array(1=>Oval, 2=>Shape)
是的, RewriteRule
使用与perl兼容的正则表达式。 这与PHP在preg_match()
所做的一样。
不同之处在于,在ModRewrite
您可以给它加上前缀!
不匹配的东西。
另一件事是,当您添加NC
标志时,它们不区分大小写。 在PHP正则表达式中,可以使用i
修饰符来实现。
因此,在重新发明轮子之前,为什么不选择该功能呢? 它是这样的:
$url = 'Oval-Shape.html';
$regexp = '([^/]+)-([^/]+).html';
$result = preg_match("({$regexp})i", $url, $params);
print_r($params);
这是输出:
Array
(
[0] => Oval-Shape.html
[1] => Oval
[2] => Shape
)
因此, $params[1]
是您在.htacces中称为$1
的东西,依此类推。
您将无法完全模拟Apache的mod_rewrite
因为Apache将在分派请求之前重写Url,而当PHP被取消时,请求已被分派。 例如,如果您要求
/index.php?page=mypage
与.htaccess
一样
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^(.*)$ index.php?page=$1 [NC,L]
您也可以使用
/mypage
这将导致使用$_SERVER['REQUEST_URI'] = '/mypage'
和$_GET['page'] = 'mypage'
来调用index.php
无法复制此行为,因为Apache将找不到mypage
并且将发出错误404。
此行为可以轻松地用PHP替换,并允许使用更灵活,更复杂的规则(例如基于数据库记录的规则)。
将其放在您的.htaccess文件中:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]
这样,每个请求都转发到index.php。 然后,您可以获取并解析$_SERVER['REQUEST_URI']
变量,并将页面执行转发到任何需要的地方。
这是当前每个MVC框架所做的事情。 这称为路由。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.