【问题标题】:Is it improper form to use a 404 as a basis for a php website?使用 404 作为 php 网站的基础是不恰当的形式吗?
【发布时间】:2012-11-23 14:29:47
【问题描述】:

(对不起,如果这是一个重复的问题,我很难考虑如何搜索它,只是想出了数千个关于如何使 404 工作的结果。) p>

我正在尝试构建一个大致遵循以下形式的 PHP 网站:http://www.example.com/user/MrPoopPants

我想知道最好的解决方案。在试图弄清楚 URL 缩短器如何重定向时,一个网站建议通过 404 发送每个请求,并让 404 错误页面使用 $_SERVER['REQUEST_URI'] 评估数据

这样,你可以preg_split,并询问数据库是否有一个名为 MrPoopPants 的用户,然后只需使用 PHP 基于包含和他的数据库构建你的网站。

我不喜欢的两个问题是:我对网站的每个页面都使用了 404,这似乎是一件非常糟糕的事情;我还依赖于整个网站的单个 php 文件,这看起来很糟糕。

最好的方法是什么?编辑:也就是说,我意识到这是一种不好的做法,解决方案是什么?如何在不重定向到 404 的情况下检测 URL 信息?如何设置页面,以便在您执行 /user/manboy 时它知道让 /user/user.php 读取 URL 并构建页面?

【问题讨论】:

  • 搜索前端控制器和 .htaccess URL 重写应该为您提供一个开始的地方(抱歉,我无法提供更多详细信息;我也有一段时间没有使用这个了)。
  • 用 404 建立一个站点并不是一个好主意,主要是因为 HTTP 状态代码是为“未找到”保留的,而事实并非如此。您希望始终发送正确的 HTTP 代码:w3.org/Protocols/rfc2616/rfc2616-sec10.html

标签: php http-status-code-404


【解决方案1】:

您实际上是在询问 URL 重写。可以在 here 找到一个很好的初学者教程,解释mod_rewrite 的所有重要位和字节。

处理重写请求的 PHP 部分恐怕是 PHP 101,没有人可以简单地向您“解释”。您需要针对非常具体的问题提出具体问题,以便人们能够真正帮助您。

【讨论】:

  • 你说我是初学者是对的。感谢您的建议!
【解决方案2】:

您尝试做的事情可以通过 URL 重写来完成。虽然你真的应该研究一个 PHP 框架,但你可以自己重写。

它允许您创建像 http://mydomain.com/user/1 这样的 URL,您可以通过将其重写为 http://mydomain.com?q=user/1 在服务器上处理这些 URL。

然后,您可以使用以下代码访问 URL: $url = $_GET['q'];

http://www.addedbytes.com/for-beginners/url-rewriting-for-beginners/

【讨论】:

  • 谢谢,我一定会调查的!
【解决方案3】:

404 错误并不是您真正用来使您的网站正常运行的工具。相反,请仅将其视为在找不到客户要求的内容时发送给客户的响应。

处理此问题的更好方法是设置您的 Web 框架,以便您有一个脚本来响应 http://www.example.com/user/_____ 形式的任何 URL,其中任何内容都遵循最终的 /。然后您可以编写代码在数据库或其他任何地方查找用户名,并生成所需的结果页面。

【讨论】:

  • 感谢您的回复,但您只是重申了我在问题中表达的担忧。如何在没有 apache 发送 404 的情况下创建响应 URL 的页面?如果我确实使用'/user/manboy',它怎么知道重定向到'/user/user.php'?
【解决方案4】:

这里关于重写规则的其他答案是绝对正确的。但是,我过去曾遇到过一种情况,即在一个主机名下托管大量不同应用程序的服务器,我必须完全按照您的建议进行操作。

基本上,由于共享 IIS 服务器上的重写配置被锁定,我将 404 页面设置为 PHP 脚本。此脚本将在数据库中查找尝试的 URL,以查看它是否设置为重定向到其他地方。

现在这里的关键是从未向客户端发送 404。客户端收到带有 Location 标头的 301 或 302。客户端从来不知道它遇到了 404 页面,因为它没有作为一个返回。 (当然,如果脚本在数据库中找不到重定向条目,它会返回正确的 404 页面和状态码。)

简而言之,虽然非常规,但如果您已经用尽了正常的选择,并且谨慎对待客户的回应方式,那么这种方法没有任何问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 2015-03-25
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多