Php 您的用户必须至少能够通过.htaccess文件修改Apache配置。情况可能并非总是如此

Php 您的用户必须至少能够通过.htaccess文件修改Apache配置。情况可能并非总是如此,php,model-view-controller,forms,rest,url-routing,Php,Model View Controller,Forms,Rest,Url Routing,另一种方法是在代码中写入逻辑,以解析URL。在这种情况下,您通常需要整个站点的控制脚本。URL类似于: http://your.domain/users.php/edit/<some_id> <?php // get the part that appears after the script name $parts = explode("/", $_SERVER['PATH_INFO'] ); $request = $parts[1]; $id = $parts[2];

另一种方法是在代码中写入逻辑,以解析URL。在这种情况下,您通常需要整个站点的控制脚本。URL类似于:

http://your.domain/users.php/edit/<some_id>

<?php

// get the part that appears after the script name
$parts = explode("/", $_SERVER['PATH_INFO'] );

$request = $parts[1];
$id = $parts[2];

// do somethign with the $request and the $id 

?>
http://your.domain/users.php/edit/
正如您所看到的,我的示例过于简单,但使用选项2,更容易使用更复杂的逻辑来完成各种事情


希望对您有所帮助。

您可以使用这样的
.htaccess
文件

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
嘿,亨德里克斯, 我正在做一些您正在做的事情——通过研究其他框架并从头开始创建一个框架来学习MVC

首先,您不应该使用GET来处理任何表单数据。使用POST或PUT代替。POST仅用于从web服务检索信息。您可以使用GET中的操作来操纵要检索的信息(例如排序顺序、页面等)

关于你的观点:

1)不要使用GET方法表单

对。首先,为了获得特定的视图,必须使用表单,这听起来是不正确的

2)使用AJAX代替表单提交

没错。您的表单和URL应该可以使用JS,也可以不使用JS

3)使用post方法让页面提交到自身,然后将post变量改为url,然后使用标题重新发送到该url(似乎浪费了资源)

我不会说这是浪费资源。你的应用程序只需要几毫秒。事实上,这正是我最终要做的。当前端控制器检测到POST的使用时,它将其发送给控制器,控制器对提交的数据执行必要的操作。根据结果,应用程序或者重定向客户端,或者呈现请求的页面(无重定向)。是的,它对任何URL都是一样的

同时,如果在URL中找到某个参数,则前端控制器将分派给相应的控制器。但这从未用于以任何方式处理数据。例如,当您在移动浏览器中浏览时想要使用www时,这用于记住首选域(www或移动)

此外,在我看来,浪费的资源可能是应用程序决定重定向到哪里(或者在HTTP查询或PHP会话中传递重定向URL)。在任何情况下,实现替代方法都需要开发时间和服务器资源


因此,在我看来,3是一条路。

我知道如何使用mod rewrite将干净的URL定向到我希望它们去的地方。问题是,如何让get方法表单首先转到干净的url。mod rewrite可以将干净的url定向到真实的url,但是如何让get方法表单首先转到(显示)干净的url?你是否修改重写了两次?你的意思是用METHOD=“GET”ACTION=“?url=1¶m=2”代替形式代码中的METHOD=“GET”ACTION=“/url/1/param/2”?我在这里看不到我的问题的答案?@dqhendricks ok-基本上。。。在it上使用MVC与你如何处理你的URL无关-这两个主题如何相处有一些最佳实践,但仅此而已,我不知道如何按照我的意愿引导/使用干净的URL。问题是,如何让get方法表单作为一个干净的url提交。@dqhendricks-Redirect使其不显示。重写它,使其不显示或不使用POST。他们不能“提交一个干净的URL”。你唯一能做的就是隐藏它。对于我的MVC,我不使用常识中的$\u GET变量。我只是将它们作为命名参数传递。因此,对于类似“GET”的变量,我的URL看起来像这样:“www.site.com/controller/action/param1/named:param。”冒号用于指定以下值具有特定名称。然后在我的应用程序中设置一个全局变量来存储所有命名变量。这个URL在RESTful API中处理资源命名。我相信它应该为任何遇到它的人提供清晰的信息(他们可能正试图根据这个问题创建自己的MVC系统)。感谢您的回答@Cfreak。这让我找到了正确的方向。在这方面似乎有很多不同的机会。
if (/* form has been submitted */) {
    $data = array_map("urlencode", $_GET);
    $url = sprintf('/%s/%s/%s', $data['a'], $data['b'], $data['c']);

    header("Location: $url");
    echo "Redirection: <a href='$url'>$url</a>";
    exit;
}
formReference.addEventListener("submit", function() {
    /* do exactly the same as above PHP code */

    return false;
}, false);
http://your.domain/users.php?request=edit&id=<some id>
RewriteRule ^users\/edit\/(\d+) /users.php?request=edit&id=$1
http://your.domain/users/edit/<some id>
http://your.domain/users.php/edit/<some_id>

<?php

// get the part that appears after the script name
$parts = explode("/", $_SERVER['PATH_INFO'] );

$request = $parts[1];
$id = $parts[2];

// do somethign with the $request and the $id 

?>
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
$params = explode('/', $_GET['url']);
$controller = new $params[0];//load the controller
$controller->$params[1]($params[2]);//ejecute the method, and pass the param