动态创建网址

时间:2016-05-14 02:35:03

标签: php .htaccess url mod-rewrite url-rewriting

让我感到困惑的是网站如何拥有以下网址:

- 和 -

最初,我认为你只需创建一个php文件并在.htaccess中使用URL重写。例如:

显然,情况并非如此,因为它不仅对更多的尾随斜杠效率不高,而且像Wordpress这样的CMS会自动生成“动态”的内容。 URL,如果无法识别URL,则重定向到301页。

我想将这个实现到我的网站中,我对我如何处理这个问题完全无能为力。由于我自己并不知道这个系统究竟是什么,我正在努力深入研究这个话题。显然,我看这完全错了,这让我感到困惑。

如果有人可以解释这个系统的调用方式,以及我该怎么做。我不想得到勺子代码,我只需要有人来解释它。

编辑:经过一番深入研究,我找到了一个完美的例子,让我的问题更加清晰。请注意这个网址:

与:

具有相同的网址

但是展示了不同的内容,它是一个全新的页面,它是动态的“动态”。创建

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

谢谢, 萨顿

4 个答案:

答案 0 :(得分:3)

当然,如果您使用像Laravel这样的框架,它是一种非常简单的路由方式。

有一个" routes.php"每个项目中的文件,用于定义对URL的调用并使用控制器方法进行响应。这通常会返回一个视图。 这样可以轻松创建类似这样的行

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

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

这可以通过其他方式扩展。 你可以有另一条路径几乎相同,但有另一种方法,当有人将后期数据发送到同一个控制器。

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

所以现在你有了另一条路线,它将对该页面进行后期输入,并从同一个控制器中激发一个完全不同的方法。这些控件+许多更多可以让你轻松实现你想要的东西,并且是laravel核心基础的一部分。

这是laravel页面上的Routing page,可以更多地照亮你。

答案 1 :(得分:1)

有许多框架使用术语url重写但显然不是指.htaccess。它通常被称为路由。 WordPress通过使用页面slugs来实现这一点。

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

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

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

答案 2 :(得分:1)

在不需要路由的情况下实现相同结果的低技术方法是创建具有所需名称的文件夹,并在其中包含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。

答案 3 :(得分:0)

  

如果有人可以解释这个系统叫什么

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

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

当用户访问shop.php

时,第一个示例将显示www.site.com/shop/的内容

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

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

  

[L]标志导致mod_rewrite 停止处理规则集。在   大多数情况下,这意味着如果规则匹配,则没有进一步的规则   将被处理。这对应于Perl中的最后一个命令,或   C中的break命令。使用此标志指示当前   应立即应用规则而不考虑进一步的规则。

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

<强>资源:

详细了解mod_rewriterewrite Flags