【问题标题】:Apache htaccess redirect all 404 (files and folders)Apache htaccess 重定向所有 404(文件和文件夹)
【发布时间】:2017-05-04 23:05:42
【问题描述】:

我想将所有“404”错误重定向到 PHP 文件。我使用来自 Wordpress 的 .htaccess 作为初始步骤。有效,但当路径是文件夹时无效,意味着末尾有一个“/”,我收到一个禁止错误。

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /includes/redir.php [L]

如果我尝试:

http://example.com/anything

按预期工作,重定向到我的 redir.php。但如果我尝试:

http://example.com/anything/

返回一个禁止错误。

我需要做什么来重定向到 redir.php 一切不存在的东西? 我需要更改 httpd.conf 吗?我需要一个“ErrorDocument 404 /includes/redir.php”行吗?

【问题讨论】:

  • 澄清一下,这实际上不是 WordPress 网站?
  • 不,它是一个 PHP 站点,我只是使用来自 Wordpress 站点的 .htaccess 作为起点。
  • 在你上面的例子中,/anything 是一个物理目录吗?否则,您不应该收到 403 Forbidden 错误。
  • 不,根文件夹中没有名为“anything”的文件夹或文件(例如)。

标签: apache .htaccess mod-rewrite http-status-code-404


【解决方案1】:

我需要一个“ErrorDocument 404 /includes/redir.php”行吗?

是的,使用这样的ErrorDocument 指令比尝试手动重定向/重写到错误文档要好得多。

定义的ErrorDocument 将返回正确的HTTP 状态代码(无需您手动执行此操作)。并且 PHP 会在 $_SERVER 超全局变量中设置与此错误相关的额外变量。


如果您特别想改写 404 上的文件,那么您可以执行以下操作:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ /includes/redir.php [L]

但不是当路径是文件夹时,意味着最后有一个“/”,我得到一个禁止错误。

URL“看起来”像一个文件夹实际上并不重要,除非 URL 映射到磁盘上的物理文件夹。只有在没有目录索引文档的情况下,您才会收到 403 Forbidden。

【讨论】:

  • 就是这样!需要 ErrorDocument 并删除 RewriteBase。谢谢!
  • RewriteBase 指令在这种情况下实际上并没有做任何事情。 RewriteBase 指令只是设置用于相对(不是以斜线或方案开头)路径substitutions 的路径。例如RewriteRule ^ redir.phpredir.php相对/redir.php 不是)。如果您没有相对路径,那么它是多余的。 (您会看到很多关于 RewriteBase 指令的混淆,但仅此而已。)
  • 感谢您提供的信息。无论如何,使用你的指令,它现在正在工作。我也尝试了其他事情,现在我不确定是否是解决问题的另一件事。但是非常感谢您的帮助和信息。
猜你喜欢
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
  • 2015-09-02
  • 2017-04-15
  • 1970-01-01
  • 2014-04-03
  • 2021-06-29
相关资源
最近更新 更多