繁体   English   中英

有没有PHP函数来模拟apache mod_rewrite的工作方式?

[英]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.

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