传递看起来像URI目录的GET参数

时间:2009-08-14 16:00:41

标签: php html apache mod-rewrite uri

我看过很多看起来像这样的URI:

www.fakesite.net/stories/1234/man_invents_fire

我想知道URI的/ 1234 / man_invents_fire部分是否实际上是目录,或者它们是否是GET参数(或其他东西)。我注意到很多时候/ man_invents_fire段是不必要的(可以删除而没有后果),这让我相信/ 1234 /是数据库表中故事的id号(或者那些东西)线)。

如果URI的那些段是GET参数,是否有一种简单的方法可以实现这一点? 如果他们不是,那么做了什么?

(另外,我知道CodeIgnitor提供了这种功能,但我很想知道它是否可以在没有CodeIgnitor的情况下轻松实现。但是,我通常是PHP,如果这与答案相关)< / p>

由于

8 个答案:

答案 0 :(得分:2)

最简单的方法是将所有内容路由到主index.php文件中并通过运行$ pieces = explode(“/”,$ _SERVER ['REQUEST_URI'])从那里找出路由;

安装/启用mod_rewrite后,确保apache配置中的allow override未设置为false(允许读取.htaccess),然后将其放入docroot的.htaccess文件中。

<ifModule mod_rewrite.c>
    RewriteCond %{REQUEST_FILENAME} !-s #Make sure the file doesn't actually exist (needed for not re-routing things like /images/header.jpg)
    RewriteRule .  /index.php  [L,QSA] #re-route everything into index.php
</IfModule>

答案 1 :(得分:0)

这就是所谓的url重写,google for it,你会发现很多关于它的信息。

答案 2 :(得分:0)

就像WordPress中的固定链接一样,这通常是通过Apache的mod_rewrite(或者如果不使用Apache的话等效)完成的;但是,您也可以使用404错误页面处理程序来实现相同的结果(但通常不建议这样做。)

通常,所有页面请求都会重定向到网关,该网关会解析所请求的URI,以确定它是否符合指定的模式(在您的情况下可能是/{category}/{article_id}/{article_title})。从那里,网关通常只能使用article_id来检索适当的内容。

根据系统的不同,categoryarticle_title

但是,在某些情况下category可能会以某种方式用于增加article_id(例如:确定要查询的数据库表等)。

像Zend一样,MVC也使用类似的技术来确定执行哪个控制器和方法。此类用法的示例格式为/{module}/{controller}/{method};但是,这是高度可定制的。

答案 3 :(得分:0)

嗯,你认为 1234 main_invents_fire 是参数是正确的。在HTTP协议描述它们的意义上,它们不是真正的GET参数,但它们完成相同的任务,同时保持URL“友好”。这项技术被称为URL rewriting,这些天网上充满了信息......

这是一个article about friendly URLs in PHP,但我确信谷歌搜索该主题将提供更有用的结果。

答案 4 :(得分:0)

在PHP中实现此操作通常是通过.htaccess文件并使用apache's mod_rewrite module完成的。

答案 5 :(得分:0)

他们制作这样的网址,以便人们可以轻松地为其添加书签,并且可以在搜索中安全返回。

取决于您使用何种语言对其进行解码。在这种情况下,它显示“stories”是主脚本,“1234”是id,“man_invent_fires”是标题。

如果您使用的是php,可以使用$ _SERVER ['PHP_SELF']或$ _SERVER ['REQUEST_URI']变量对其进行解码。

如果您打算建立这样的网站,必须牢记一定的安全性。在google中查找它们,但要注意的关键是sql注入器。

答案 6 :(得分:0)

除了我之前的答案之外,作为一些背景信息,URL就是 - “统一资源定位器”。虽然在过去,它经常用于将1:1映射到文件/目录结构,但HTTP规范中所需的全部内容都是标识某个资源。基本上这意味着,给定一个字符串,它应该指示服务器上的某个“资源”。实际上,在HTTP环境中,这通常使用诸如mod_rewrite之类的重写机制来实现。像这样的RFC:http://www.ietf.org/rfc/rfc1738.txt给出了一个很好的,尽管是抽象的概述。但是,在设计和实现一些非显而易见的用途之后,这些概念才会生效。

答案 7 :(得分:-1)

如果您使用Symfony,则可以使用routing feature执行此操作。