Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在无404头的Apache php服务器上捕获并保留重定向URI_Php_Apache_.htaccess_Redirect_Http Status Code 404 - Fatal编程技术网

在无404头的Apache php服务器上捕获并保留重定向URI

在无404头的Apache php服务器上捕获并保留重定向URI,php,apache,.htaccess,redirect,http-status-code-404,Php,Apache,.htaccess,Redirect,Http Status Code 404,在无404头的Apache php服务器上捕获并保留重定向URI 我正在建立一个新闻网站/博客。我想以特定的方式格式化URL。例如: 我不想为每一篇文章都创建一个目录结构的麻烦和混乱。我已将.htaccess文件设置为重定向到具有 ErrorDocument 404/main_file.php 然后,我的主文件使用$\u SERVER[REQUEST\u URI]查找请求的页面,然后构建页面 一切都很好。唯一的问题是,我相信.htaccess重定向会向客户端发送404头。我曾尝试在主文件中使用

在无404头的Apache php服务器上捕获并保留重定向URI

我正在建立一个新闻网站/博客。我想以特定的方式格式化URL。例如:

我不想为每一篇文章都创建一个目录结构的麻烦和混乱。我已将.htaccess文件设置为重定向到具有

ErrorDocument 404/main_file.php

然后,我的主文件使用$\u SERVER[REQUEST\u URI]查找请求的页面,然后构建页面

一切都很好。唯一的问题是,我相信.htaccess重定向会向客户端发送404头。我曾尝试在主文件中使用followup200头来抵消这一点,但我认为它不起作用。W3C验证器检测到404仍然存在,搜索引擎似乎没有索引页面


如何在不向浏览器发送404错误的情况下保持URL的格式?有没有一种简单的替代方法,不需要创建几十个文件夹?

您可以使用简单的内部重定向将任何不存在的文件或文件夹重定向到您的
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]
并使用
$\u SERVER['REQUEST\u 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/
致:

但是,浏览器URL将保留为:

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

1.)发送2个http状态头毫无意义。2.“.htaccess重定向”不发送http头。那么真正的问题是什么呢?我想说你重写404错误文档的基本策略是错误的。你选择了错误的方法。不要等到服务器点击404文档,而是重写原始请求。将它重写到main_file.php,就可以了。地址不是服务器上的文件。调用该地址时,htaccess执行“errordocument404main_file.php”。然后,主文件创建请求的页面。就用户而言,“文章标题”是存在的。然而,如果我将该地址放入WC3验证器,它将检测到错误404。如果htaccess没有生成它,它来自哪里?我只是添加了这个“第二个标题”来抵消幻影404。我现在发现我可以发送一个头301来停止404,但这并不理想。我更喜欢200。我完全理解你的策略,但这是错误的策略。实际上,在当今互联网上的大多数页面或系统中,情况并非如此。相反,在请求遇到错误404之前重写请求,所以在开始时就要正确。您可以从传入的请求中选择所需的参数,然后将请求重写为您喜欢的任何内容。注意:您重写了传入的请求。这样,系统就不会查找物理文件,因此它不会抛出错误404,而是调用您的脚本,而不是像您现在这样移交参数。这是重写请求的正常策略。我误解了你。我不明白你所说的重写是什么意思。我绝对不是Apache命令方面的专家。我的知识仅限于.htaccess和ErrorDocument命令。这听起来正是我想要做的。我想这些都输入了.htaccess文件。我注释掉了我的ErrorDocument,并将您的第一个示例放入htaccess。到目前为止,我还没有看到它突然行动起来。我现在正在查看Apache文档:httpd.Apache.org/docs/2.2/mod/mod_rewrite.html#rewritecond@The_Stewart当你把它放进去的时候会发生什么,给我一个详细的信息,这样我就可以告诉你可能出了什么问题以及如何修复。您知道其中一个:未找到,在此服务器上未找到请求的URL/news/1234/。此外,尝试使用ErrorDocument处理请求时遇到404 Not Found错误。“它似乎无法识别所满足的重写条件。@表示main\u file.php不存在的\u Stewart。你能告诉我文件在哪里吗,例如
http://example.com/file.php?id=1234
如果这是文件所在的位置,并引导您进入主题,则我们需要将其重写到该位置。最初我按原样尝试了您的代码,但现在我也尝试了更改位置,但运气不佳。目前,main_文件和htaccess位于服务器顶层的同一目录中。“ErrorDocument 404/main_file.php”查找该文件。因此,我将“RewriteRule^(.*)$main_file.php/$1[L]”更改为“RewriteRule^(.*)$/main_file.php/$1[L]”。这一定是疏忽。
http://example.com/news/1234/title_of_article/