2017-05-04 578 views
1

我想重定向到PHP文件的所有“404”错误。我使用Wordpress的.htaccess作为第一步。工作,但不是当路径是一个文件夹时,意味着,在末尾有一个“/”,我得到一个Forbidden错误。Apache htaccess重定向所有404(文件和文件夹)

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”行?

+2

只是为了澄清,这实际上不是一个WordPress网站? – MrWhite

+1

不,这是一个PHP站点,我只是使用Wordpress站点的.htaccess作为起点。 – Arvy

+1

在你上面的例子中,'/ anything'是一个物理目录吗?否则,你不应该得到一个403禁止错误。 – MrWhite

回答

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禁止访问。

+1

就是这样!需要ErrorDocument并删除RewriteBase。谢谢! – Arvy

+1

“RewriteBase”指令实际上并没有在这方面做任何事情。 'RewriteBase'指令只设置用于相对路径(不以斜杠或方案开始)的路径_substitutions_。例如'RewriteRule^redir.php'('redir.php'是_relative_,'/ redir.php'不是)。如果你没有相对路径,那么这是多余的。 (你在'RewriteBase'指令中看到了很多混淆,但这只是它。) – MrWhite

+1

谢谢你的信息。无论如何,使用你的指令,它现在正在工作。我也试过其他的东西,现在我不确定是否有另一件事解决了这个问题。但你的帮助和信息真的很感激。 – Arvy