动态创建URL


Dynamically create URLs

真正让我困惑的是网站如何具有URL,例如:

  • http://example.com/shop/

-和-

  • http://example.com/shop/product-category/games/

最初,我认为您可以简单地创建一个php文件,并在.htaccess中使用URL重写。例如:

  • http://example.com/shop.php
  • http://example.com/shop.php/product-category.php/games.php(这根本没有道理)

显然,情况并非如此,因为它不仅对更多的尾随斜杠无效,而且CMS(如Wordpress)会自动生成"动态"URL的内容,然后在URL未被识别的情况下重定向到301页面。

我想在我的网站上实现这一点,我只是完全不知道该如何处理。我很难深入研究这个话题,因为我自己不知道这个系统到底是什么。显然,我完全错了,这让我混淆了自己。

如果有人能解释这个系统的名称,以及我如何做到这一点。我不想得到填鸭式的代码,我只需要有人来解释它。

编辑:经过进一步的研究,我找到了一个完美的例子来让我的问题更清楚。注意这个网址:

  • https://gamurs.com/g/csgo/players

具有与相同的url

  • https://gamurs.com/g/csgo

但显示了不同的内容,这是一个全新的页面,正在"动态"创建。

然后来自同一网站的更多随机URL:

  • https://gamurs.com/articles/world-esports-association-announced
  • https://gamurs.com/coaches

谢谢,Sutton

因此,如果您要使用Laravel这样的框架,这是一种非常简单的路由方式。

每个项目中都有一个"routes.php"文件,该文件定义对URL的调用,并使用controllers方法进行响应。这通常会返回一个视图。它使创建这样的东西变得像添加这样的一样容易

Route::get('home', 'PagesController@home');

到路由文件,当您转到example.com/home时,它将启动名为"PagesController"的控制器并运行其home方法。在这个方法中,您可以返回一个视图,该视图将是您想要显示的页面。

这可以通过其他方式扩展。你可以有另一个几乎相同的路由,但当有人向同一控制器发送邮件数据时,你可以有其他方法。

Route::post('home', 'PagesController@submittedhome');

因此,现在您有了另一条路径,它将post输入到该页面,并从同一个控制器激发一个完全不同的方法。这些类型的控制+更多的控制可以让你非常容易地实现你想要的,这是laravel的核心基础的一部分。

这是laravel页面上的路由页面,它可以为您提供更多信息。

有很多框架使用url重写这个术语,但显然不是指.htaccess。通常它被称为路由。WordPress通过使用页面碎片来做到这一点。

在WordPress中,.htaces绕过WP,直接通过发送对现有文件和目录的请求。任何与上述不匹配的内容都必须是"虚拟"页面。并发送到index.php

然后以一种或另一种通常涉及正则表达式的方式解析URI。URI路径的每一部分都与一个"slug"相关,然后这些部分用于创建数据库查询以生成相关内容。

在为某些段塞类型选择特定模板方面还有很多工作要做。

在不需要路由的情况下实现相同结果的一种低技术方法是创建一个具有所需名称的文件夹,并在其中包含一个index.php(或index.html)。然后,当调用url时,默认情况是打开文件夹中的索引文件,即使url中没有指定。

因此

http://example.com/shop.php/product-category.php/games/

相当于调用

http://example.com/shop.php/product-category.php/games/index.php

请注意,我并不提倡这样做(我认为这会很快变得混乱,而且有更有效的解决方案),我也不建议给定的例子以这种方式进行,但我想发布这篇文章,因为这是一种在没有列出文件名或索引的情况下生成url的可行方法。只是不是一个很好的IMO.

如果有人能解释一下这个系统被称为

它被称为RewriteEngine,是apachemod_rewrite的一部分,其他web服务器有不同的mod,但这是最受欢迎的。

RewriteEngine  on
RewriteRule    ^shop/$  shop.php  [L]
RewriteRule    ^shop/products/(.*?)/$  products.php?type=$1  [L]

1st示例将在用户访问www.site.com/shop/ 时显示shop.php的内容

如果用户访问www.site.com/shop/products/games/第二个示例将把games作为参数($1)发送到products.php?type=$1


[L]-称为标志(L|last):

[L]标志导致mod_rewrite停止处理规则集。在里面在大多数情况下,这意味着如果规则匹配,就没有其他规则将被处理。这对应于Perl中的最后一个命令,或者C.中的break命令。使用此标志表示当前该规则应立即适用,无需考虑其他规则。


^相对于web根(somesite.com/^
$表示字符串(somesite.com/^somedir/test/$ this part will not be processed)的末尾


资源:

了解有关mod_rewrite和rewrite Flags 的更多信息