如何在 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 重写?的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时在php中重写URL

使用 htaccess 重写后,如何在 PHP 中获取可见 URL(不是实际 URL)? [复制]

如何在php中重写Get变量的url [重复]

如何在apache中重写url

web前端如何重写URL地址

如何进行简单的url重写[重复]