【发布时间】:2013-08-25 19:16:00
【问题描述】:
在没有 404 标头的 Apache php 服务器上重定向时捕获和保留 URI
我正在建立一个新闻网站/博客。我想以特定方式格式化 URL。像下面这样:
http://example.com/news/1234/title_of_article/
我不希望为每篇文章都创建一个目录结构的麻烦和混乱。我已将 .htaccess 文件设置为使用
重定向到主文件ErrorDocument 404 /main_file.php
然后我的主文件使用 $_SERVER[REQUEST_URI] 找出请求的页面,然后构建该页面。
一切都很好。唯一的问题,我相信 .htaccess 重定向会向客户端发送 404 标头。我试图用主文件中的后续 200 标题来抵消这一点,但我认为它不起作用。 W3C Validator 仍然检测到 404,搜索引擎似乎没有索引页面。
如何在不向浏览器发送 404 错误的情况下保持 URL 的格式?有没有不创建几十个文件夹的简单替代方案?
【问题讨论】:
-
1.) 发送 2 个 http 状态标头永远没有意义。 2.)“.htaccess 重定向”不发送 http 标头。那么真正的问题是什么?
-
我会说你重写404错误文档的基本策略是错误的。你选择了错误的方法。不要等到服务器命中 404 文档,改写原来的请求。把它重写给你 main_file.php 就可以了。
-
地址example.com/news/1234/title_of_article不是服务器上的文件。当调用该地址时,htaccess 会执行“ErrorDocument 404 main_file.php”。然后主文件创建请求的页面。对于用户而言,存在“文章标题”。但是,如果我将该地址放入 WC3 验证器,它会检测到错误 404。如果 htaccess 没有生成它,它是从哪里来的?我只添加了这个“第二个标头”来抵消幻象 404。我现在发现我可以发送一个标头 301 来停止 404,但这并不理想。我更喜欢 200。
-
我完全理解你的策略,但这是错误的策略。实际上,在当今互联网上的大多数页面或系统中,情况并非如此。而是重写请求 before 它遇到错误 404,所以就在开头。您从传入的请求中选择您需要的参数并将请求重写为您喜欢的任何内容。注意:您重写 incoming 请求。这样,系统永远不会寻找物理文件,因此它永远不会抛出错误 404,而是调用您的脚本,而不是像现在一样移交参数。这是重写请求的正常策略。
-
我误会了你。我没有意识到你所说的重写是什么意思。我绝不是 Apache 命令方面的专家。我的知识仅限于 .htaccess 和 ErrorDocument 命令。
标签: php apache .htaccess redirect http-status-code-404