如何在 php 中进行 URL 重写?
Posted
技术标签:
【中文标题】如何在 php 中进行 URL 重写?【英文标题】:How do I do URL rewriting in php? 【发布时间】:2010-10-06 01:35:13 【问题描述】:这是一个双重问题:正确答案将转到“你如何在 php 中做到这一点”,解释是否有任何优势,如果可能的话也很重要。
我只是好奇,因为我真的不知道,我在网页上看到很多。
编辑:我不知道技术名称,但例如在 *** 上:
“http://***.com/posts/edit/522452
”是我所说的“文件夹”(以前在问题标题中使用的术语)。
【问题讨论】:
嗯? “将参数作为‘文件夹’传递”是什么意思? 是的,就像在 *** 中一样:p 我不知道技术名称 我认为他的意思是路由,就像在 MVC 中一样。 堆栈溢出使用 ASP.NET MVC。您指的是使用传统的“GET”请求。 MVC 以不同的方式处理它(我故意过于简单化)。 好的,这样结构只能在 mvc 中实现?还有什么优势吗? 【参考方案1】:优点是可读性和可能在搜索引擎中更好的位置。
如果您使用的是 Apache,您可以通过 mod_rewrite
实现此目的。在 PHP 中,您还可以查看预定义的全局变量 - 我认为 $_SERVER['REQUEST_URI']
有效,但可能会有更好的全局变量。
在不重写的情况下使用纯 PHP 时,如果您适当地配置您的服务器,您也可以从脚本文件名中删除 .php
,因此仍然可以获得“不错”的 URL。
【讨论】:
【参考方案2】:有几个原因,但主要是:
SEO 目的。搜索引擎通常会忽略“?”之后的任何内容。问号符号,从而使您无法索引页面,甚至更糟糕的是,根本没有索引。
可读性:
www.somesite.com/products/devices/keyboards/20,asc
www.somesite.com/products/devices/keyboards/20,asc.html
看起来比:
www.somesite.com?show=products&cat=devices&sub_cat=keyboards&sort=asc&items=20
缓存。
有关如何在 Apache 中执行此操作的信息: http://httpd.apache.org/docs/2.0/misc/rewriteguide.html
【讨论】:
【参考方案3】:如果您指的是 /posts/edit/522452
样式的 URL,而不是 /posts.asp?action=edit&postid=522452
样式的 URL(或它在后端转换的任何内容),这通常是通过 URL 重写器完成的,例如 mod_rewrite
.该 URL 的规则可能如下所示:
RewriteRule ^/posts/(\w+)/(\d+) /posts.asp?action=\1&postid=\2
这种 URL 的两个主要优点是:
-
“文件夹”类型的 URL 更便于人们输入和记住。
页面“看起来像”HTTP 代理的页面。传统上,代理不会缓存带有参数的页面,因为它们不代表单独的内容并且更改过于频繁(想想搜索结果)。使用“文件夹样式”的 URL 可以正常缓存它们。
在 PHP 中,您可以通过 $_GET['action']
和 $_GET['postid']
访问这些选项,就像浏览器要求重写表单一样。
【讨论】:
【参考方案4】:正如其他人所指出的,出于 SEO 目的、缓存和可读性的一部分,我想补充一点,文件夹样式的参数也是用户“玩弄”参数的动力。例如,在 *** 上,当按标签过滤时,通常很容易手动编辑 url,而不是寻找合适的按钮并单击它。
【讨论】:
【参考方案5】:要使用此类 URL,您必须执行三个步骤:
告诉您网络服务器,这些请求应该重定向到您的 PHP 脚本。使用 Apache,您可以使用 mod_rewrite module 来执行此操作:
重写引擎开启 RewriteCond %REQUEST_FILENAME !-f RewriteRule !^index\.php$ index.php [L]该指令将每个与文件系统中的文件不匹配的请求重定向到index.php
。
让您的脚本解析这些 URL:
$_SERVER['REQUEST_URI_PATH'] = preg_replace('/\?.*/', '', $_SERVER['REQUEST_URI']); $segments = explode('/', trim($_SERVER['REQUEST_URI_PATH'], '/')); var_dump($segments);这可能是解析 URL 路径并获取每个路径段的最简单方法。
在您的输出中使用此 URL。 (琐碎)
【讨论】:
以上是关于如何在 php 中进行 URL 重写?的主要内容,如果未能解决你的问题,请参考以下文章