GVKun编程网logo

在PHP mvc中路由URL的最有效方法?(php urldecode)

9

本篇文章给大家谈谈在PHPmvc中路由URL的最有效方法?,以及phpurldecode的知识点,同时本文还将给你拓展asp.net-mvc–从WebAPI生成MVC控制器操作的路由URL、asp.n

本篇文章给大家谈谈在PHP mvc中路由URL的最有效方法?,以及php urldecode的知识点,同时本文还将给你拓展asp.net-mvc – 从WebAPI生成MVC控制器操作的路由URL、asp.net-mvc – 在ASP.NET MVC中从相同的路由URL路径提供图像、asp.net-mvc – 如何在ASP.NET MVC中使用querystring路由URL?、asp.net-mvc – 旧版PHP URL不会在MVC中调用自定义路由等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

在PHP mvc中路由URL的最有效方法?(php urldecode)

在PHP mvc中路由URL的最有效方法?(php urldecode)

我正在开发一个简单的PHP mvc,它可以做到最低限度,但也是我需要它的工作方式,这是我第一次使用mvc方法而不是prodcedural所以我正在学习,因为我去…

在开发过程中我偶然以一种奇怪的方式创建它,目前主要的.htaccess包含几乎所有的物理重写,例如论坛是:

RewriteRule ^forum/([a-zA-Z0-9_]+)_([0-9]+)/$                   index.PHP?controller=forum&method=showThread&urlTitle=$1&threadId=$2 [L] 
RewriteRule ^forum/([a-zA-Z0-9_]+)_([0-9]+)/all/([0-9]+)$       index.PHP?controller=forum&action=showThread&urlTitle=$1&threadId=$2&page=$3 [L]

目前的工作原理是所有网址都指向index.PHP,然后使用以下网址从网址中使用哪个控制器和方法:

的index.PHP

$actionName = $_GET['action'];
$controllerName = ucfirst(strtolower($_GET['type'])).'controller';

$controller = new $controllerName;
$controller->$actionName();

控制器/ forumcontroller.PHP

class forumcontroller{

    function showThread() {

        $thread = new Thread($_GET['threadId'],$_GET['uriTitle']); 
        require "templates/thread.PHP";
    }

但这意味着用户可以前往我不希望他们也可以访问的位置,例如:

/public_html/templates/index.PHP

我认为我需要什么?

我认为主要的.htaccess看起来应该是这样的?

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$index.PHP?url=$1 [L,QSA]

然后在index.PHP中你会使用类似的东西:

$url = explode("/",`$_SERVER['QUERY_STRING']);`

$controller = $url[0];   //Returns "forum"
$data = $url[1];         //Returns the forum title and id

但是用这种方法我不明白你如何用数据调用控制器内的动作?

你不需要做类似的事情:

if(!$data)
     $controller->loadForum();
 elseif($data)
     $controller->loadForumThread($data);

结论

我只是不明白如何最好地为具有许多不同格式的SEO友好网址的网站做路由,我理解mvc应该如何工作但是我很难掌握路由部分和我来的所有例子对面似乎非常复杂!

我真的很难看到如何编码.htaccess和控制器来处理不同格式的大量网址,如下所示:

domain.com
domain.com/uploads
domain.com/profiles/username
domain.com/messages/inBox
domain.com/messages/createnew/userId
domain.com/forum/all/2
domain.com/forum/title_1/
domain.com/forum/title_1/all/3

解决方法

这是一种类似于第二个.htaccess示例的方法.

$request = explode('/',substr($_SERVER['REQUEST_URI'],1));
// Clean request array of empty elements
foreach($request as $k => $v)
    // Clear any empty elements
    if(!$v) unset($request[$k]);
$request = array_values($request);  // Renumber array keys

这给出了一个表示请求的URI的数字索引数组.应用程序可以假设请求中的第一个值是控制器的名称:

if(count($this->request) == 0) 
    $request[] = 'DefaultController';  // Responsible for homepage
$this->controller = new $request[0]( $request );

我还将$context变量传递给控制器​​构造函数,但这超出了这个问题的范围(它负责数据库连接,当前用户数据和会话数据).

之后,它只是发送请求:$this-> controller-> dispatch()

在调度方法内部,控制器本身知道请求数组.例如,在您的URL列表中,我们来看第三个示例:domain.com/profiles/username:

控制器将命名为“配置文件”:

class Profiles {
    private $request,$context;
    public function __construct($request,$context) {
        $this->request = $request;
        $this->context = $context;
    }

    public function dispatch() {
        if(count($this->request) == 2 && $this->request[1] == 'username') {
            // Load data from model for the requested username ($this->request[1])

            // Show View
        }
    }
}

有更好的方法可以将请求向量映射到操作,但希望你得到了这个jist.

asp.net-mvc – 从WebAPI生成MVC控制器操作的路由URL

asp.net-mvc – 从WebAPI生成MVC控制器操作的路由URL

我习惯于使用类似于以下内容的MVC控制器操作中的其他控制器操作生成路由URL:
public class ApplicationController : Controller
{
    public ActionResult Index( )
    {
        var url = Url.RouteUrl("routename",new { controller = "Application",Action = "Index2",other="other" });
    }

    public ActionResult Index2( string other)
    {
    }
}

但是我也需要从webapi中生成MVC控制器操作的URL,我该怎么做?

在APIController上似乎有一个UrlHelper属性,但是我无法找到任何使用该方法的示例,并且无法自己弄清楚。

更新:
我试图生成一个URL的原因是,这个特定的webapi方法发送一个电子邮件,向收件人提供一个链接,以将用户引导回到站点的适当部分。我显然希望避免硬编码,因为它不适用于不同的部署,如果我开始更改路由,这个链接将被破坏。有更好的做法吗?

解决方法

您也可以使用MVC路由名称以及Web API UrlHelper。例,
Url.Link("Default",new { Controller = "Account",Action = "Login" });

要么

Url.Route("Default",Action = "Login" });

asp.net-mvc – 在ASP.NET MVC中从相同的路由URL路径提供图像

asp.net-mvc – 在ASP.NET MVC中从相同的路由URL路径提供图像

这就是我想做的事情.我有一些内容,我写的是一个观点.此内容具有与文档相关的图像引用.例如,如果我正在查看以下网址:
http://localhost/article/8AB98/

内容可能具有以下形式的图像:

<img src="myimage.png" />

这显然会导致浏览器在以下URL查询图像:

http://localhost/article/8AB98/myimage.png

但是,由于mvc路由,将无法找到此图像.您是否知道一种简单的方法可以使该URL将正确的图像返回给浏览器?

请注意:实际上重要的是标记保持原始状态不变…这意味着以某种方式重写图像网址,以便它们指向当前视图URL之外的另一个文件夹,遗憾的是不可能.

谢谢!!

解决方法

我假设当你说“实际上重要的是标记与原始标记保持不变”时,你的意思是
<img src="myimage.png" />

是什么必须呈现给浏览器,所以你需要欺骗Web服务器采取的请求URL

http://localhost/article/8AB98/myimage.png

并仅使用该信息查找正确的图像,无论您将其存储在何处,并将其返回到浏览器.

我想到了两个选项,但很难知道要推荐哪个,因为你还没有说出存储图像的位置.

选项1 – Url重写器

购买ISAPI_Rewrite的副本,并重写所有符合上述条件的网址,以便在任何地方获取图像.有关ISAPI_Rewrite here的更多信息.

选项2 – 自定义HttpHandler

您可以编写映射到解析请求URL的所有PNG文件请求的HttpHandler,并执行查找映像所需的操作,然后将其返回到响应流.这样做的缺点是你必须告诉IIS将所有PNG请求映射到aspnet_isapi.dll,这可能是一个性能无赖.

我仍然不确定我是否正确理解你的问题,但我希望这会有所帮助.祝好运.

asp.net-mvc – 如何在ASP.NET MVC中使用querystring路由URL?

asp.net-mvc – 如何在ASP.NET MVC中使用querystring路由URL?

我试图在MVC中设置一个自定义路由,以从以下格式从另一个系统的URL:

../ABC/ABC01?Key=123\u0026amp;Group=456

01之后的第二个ABC是一个步骤号,这将改变,键和组参数将改变。我需要将其路由到控制器中的一个操作,步骤号键和组作为参数。我试过下面的代码,但它抛出一个异常:

码:

routes.MapRoute(
    "OpenCase","ABC/ABC{stepNo}?Key={key}&Group={group}",new {controller = "ABC1",action = "OpenCase"}
);

例外:

`The route URL cannot start with a '/' or '~' character and it cannot contain a '?' character.`

解决方法

您不能在路由中包括查询字符串。尝试这样的路线:
routes.MapRoute("OpenCase","ABC/ABC{stepNo}",new { controller = "ABC1",action = "OpenCase" });

然后,在你的控制器上添加一个这样的方法:

public class ABC1 : Controller
{
    public ActionResult OpenCase(string stepno,string key,string group)
    {
        // do stuff here
        return View();
    }        
}

ASP.NET MVC将自动将查询字符串参数映射到控制器中的方法中的参数。

asp.net-mvc – 旧版PHP URL不会在MVC中调用自定义路由

asp.net-mvc – 旧版PHP URL不会在MVC中调用自定义路由

我们最近用asp.net MVC网站替换了一个旧的PHP网站.为了防止来自搜索引擎中遗留网址的404错误,我们通过- http://www.mikesdotnetting.com/Article/108/Handling-Legacy-URLs-with-ASP.NET-MVC设置了自定义遗留路由系统

代码在我的本地计算机上运行,​​并重定向到正确的路由;然而,实时服务器发出404.奖金问题/线索,404不是我们的自定义404页面,而是iis 6默认页面.

代码:

public class LegacyUrlRoute: RouteBase
{
    // source: http://www.mikesdotnetting.com/Article/108/Handling-Legacy-URLs-with-ASP.NET-MVC
    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        const string status = "301 Moved Permanently";
        var request = httpContext.Request;
        var response = httpContext.Response;
        var legacyUrl = request.Url.ToString();
        var newUrl = "";

        if (legacyUrl.Contains(".PHP"))
        {

            newUrl = "/";
            if (legacyUrl.Contains("support/mailfilter.PHP"))
                newUrl = "/support/";
            else if (legacyUrl.Contains("/support/default.PHP"))
                newUrl = "/support/";
            else if (legacyUrl.Contains("/business/default.PHP"))
                newUrl = "/services/";
            else if (legacyUrl.Contains("/residential/default.PHP"))
                newUrl = "/services/";
            else if (legacyUrl.Contains("/about/default.PHP"))
                newUrl = "/home/about/";
            else if (legacyUrl.Contains("/jobs.PHP"))
                newUrl = "/jobs/";
            else if (legacyUrl.Contains("/support/links.PHP"))
                newUrl = "/support/";
            else if (legacyUrl.Contains("/support/settings.PHP"))
                newUrl = "/support/";
            else if (legacyUrl.Contains("/default.PHP"))
                newUrl = "/";


            response.Status = status;
            response.RedirectLocation = newUrl;
            response.End();
        }
        return null;
    }
    public override VirtualPathData GetVirtualPath(RequestContext requestContext,RouteValueDictionary values)
    {
        return null;
    }
}

注意:

我们怀疑问题是iis无法提供PHP页面,但我似乎无法找到iis中的设置来解决问题.就好像请求永远不会出现控制器代码,错误或其他情况.所有其他页面/路由工作完美.

解决方法

找到了答案.

问题是由于如果扩展名是.PHP,iis永远不会启动asp.net服务.

解决方案是转到属性>主目录>配置,找到.PHP扩展名,将可执行路径更改为asp.net路径,并将其限制为“GET,HEAD,POST,DEBUG”或您喜欢的任何内容.我最初选择了“All Verbs”单选按钮,但是没有用.

虽然该页面没有特别提出我想出的答案,但this page确实有所帮助.

关于在PHP mvc中路由URL的最有效方法?php urldecode的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于asp.net-mvc – 从WebAPI生成MVC控制器操作的路由URL、asp.net-mvc – 在ASP.NET MVC中从相同的路由URL路径提供图像、asp.net-mvc – 如何在ASP.NET MVC中使用querystring路由URL?、asp.net-mvc – 旧版PHP URL不会在MVC中调用自定义路由等相关知识的信息别忘了在本站进行查找喔。

本文标签: