【问题标题】:Capturing and preserving URI on redirect on Apache php Server without 404 header在没有 404 标头的 Apache php 服务器上捕获和保留重定向的 URI
【发布时间】: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


【解决方案1】:

您可以使用简单的内部重定向将任何不存在的文件或文件夹重定向到您的main_file.php,而不是使用ErrorDocument

# if folder does not exist
RewriteCond %{REQUEST_FILENAME} !-d
# if file does not exist
RewriteCond %{REQUEST_FILENAME} !-f
# redirect anything to
RewriteRule ^(.*)$ main_file.php/$1 [L]

并使用$_SERVER['REQUEST_URI'] 处理它,或者您可以进一步自定义它以将其作为参数处理,如下所示:

# if folder does not exist
RewriteCond %{REQUEST_FILENAME} !-d
# if file does not exist
RewriteCond %{REQUEST_FILENAME} !-f
# redirect anything to
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ main_file.php?category=$1&id=$2&title=$3 [L]

以上内容将在内部重定向:

http://example.com/news/1234/title_of_article/

收件人:

http://example.com/main_file.php?category=news&id=1234&title=title_of_article

但是浏览器 URL 将保留:

http://example.com/news/1234/title_of_article/

【讨论】:

  • 这听起来和我想做的完全一样。我想这都是输入到 .htaccess 文件中的。我注释掉了我的 ErrorDocument,并将您的第一个示例放入 htaccess。到目前为止,我还没有看到它付诸行动。我现在正在查看 Apache 文档:httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritecond
  • @The_Stewart 以及当你把它放进去时会发生什么,给我一个详细的信息,这样我就可以告诉你可能出了什么问题以及如何解决。
  • 我得到了通用的 Apache 404 页面。您知道:未找到,在此服务器上未找到请求的 URL /news/1234/。此外,在尝试使用 ErrorDocument 处理请求时遇到了 404 Not Found 错误。”它似乎无法识别正在满足的 RewriteCond。
  • @The_Stewart 这意味着 main_file.php 不存在。你能告诉我文件在哪里吗,例如http://example.com/file.php?id=1234 如果这是文件所在的位置并引导你进入主题,那么这就是我们需要重写的地方。
  • 最初我按原样尝试了您的代码,但现在我尝试更改位置也没有运气。目前main_file和htaccess在服务器顶层的同一个目录下。 “ErrorDocument 404 /main_file.php”找到该文件。所以我将“RewriteRule ^(.*)$ main_file.php/$1 [L]”更改为“RewriteRule ^(.*)$ /main_file.php/$1 [L]”。这一定是一个疏忽。
猜你喜欢
  • 2018-06-20
  • 2016-10-12
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多