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

是否有PHP函数来模拟apache mod_rewrite的工作方式?,php,function,mod-rewrite,Php,Function,Mod Rewrite,我被困在这里,所以我需要的是一个函数,或者,一个创建函数的想法,以与Apache的mod_rewrite相同的方式工作。 它的参数应该是regexp、writetten for mod_rewrite和url。应返回从中提取的参数数组 下面是一个简短的示例,说明它应该如何工作: function rewrite($regexp, $url){ .... } $params = rewrite('([^/]+)-([^/]+).html', 'Ov

我被困在这里,所以我需要的是一个函数,或者,一个创建函数的想法,以与Apache的mod_rewrite相同的方式工作。 它的参数应该是regexp、writetten for mod_rewrite和url。应返回从中提取的参数数组

下面是一个简短的示例,说明它应该如何工作:

    function rewrite($regexp, $url){ 
           ....
    }

    $params = rewrite('([^/]+)-([^/]+).html', 'Oval-Shape.html');

    print_r($params);
上述代码应打印:

   array(1=>Oval, 2=>Shape)
是的,使用与perl兼容的正则表达式。这与PHP在中所做的相同

不同的是,在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,依此类推。

是的,使用与perl兼容的正则表达式。这与PHP在中所做的相同

不同的是,在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被ivoked时,请求已经被发送。例如,如果您请求

/index.php?page=mypage
使用类似.htaccess的

您还可以使用请求相同的Url

/mypage

这将导致使用$\u SERVER['REQUEST\u URI']='/mypage'和$\u GET['page']调用index.php='mypage'。PHP无法复制此行为,因为Apache将找不到mypage并发出错误404。

您将无法完全模拟Apache的mod_rewrite,因为Apache将在发送请求之前重写Url,而当PHP被IVoke时,请求已被发送。例如,如果您请求

/index.php?page=mypage
使用类似.htaccess的

您还可以使用请求相同的Url

/mypage

这将导致使用$_SERVER['REQUEST\u URI']='/mypage'和$_GET['page']='mypage'调用index.php。php无法复制此行为,因为Apache将找不到mypage并发出错误404。

此行为可以轻松地用php替换,并允许更灵活和复杂的规则,例如,基于数据库记录

将此文件放入.htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]
这样,每个请求都被转发到index.php。然后,您可以获取并解析$\u SERVER['REQUEST\u URI']变量,并将页面执行转发到您希望的任何位置


这就是当前每个MVC框架所做的。它被称为路由。

这种行为可以很容易地用PHP替代,并允许更灵活和复杂的规则,例如基于数据库记录的规则

将此文件放入.htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]
这样,每个请求都被转发到index.php。然后,您可以获取并解析$\u SERVER['REQUEST\u URI']变量,并将页面执行转发到您希望的任何位置


这就是当前每个MVC框架所做的。这叫做路由。

您可能正在寻找。@AJ:可能有各种原因,为什么需要它。@AJ我需要它,是因为有人让我允许他手动编辑它的网站URL,用于seo目的。所以我无法回答他学习Apache mod_重写!!!。所以我将自定义URL存储在数据库中。但是这里没有什么新东西,Wordpress也在用同样的方法,将URL与php和许多其他cms系统进行匹配。这不能被认为是一个答案。。。但是你试过这项服务吗?P.S.在一些与.htaccess相关的帖子中找到了此链接。您可能正在寻找。@AJ:可能有各种原因,为什么需要此链接。@AJ我之所以需要此链接,是因为有人要求我允许他手动编辑其网站URL,以便进行seo。所以我无法回答他学习Apache mod_重写!!!。所以我将自定义URL存储在数据库中。但是这里没有什么新东西,Wordpress也在用同样的方法,将URL与php和许多其他cms系统进行匹配。这不能被认为是一个答案。。。但是你试过这项服务吗?P.S.在一些与.htaccess相关的帖子中找到了这个链接。