使用.htaccess和正则表达式重定向损坏的404页

时间:2019-02-10 12:26:38

标签: regex .htaccess joomla

我一直在网站上取消发布旧页面。为了避免出现404页,我想将这些页面重定向到通用页面。

例如此页面:

https://www.portal-gestao.com/artigos/7380-7-t%C3%A1cticas-de-sobreviv%C3%AAncia-%C3%A0-crise-nas-vendas.html

应重定向到:

https://www.portal-gestao.com/artigos/

我不太熟悉.htaccess或正则表达式,我想通过以下方式重定向页面:

RewriteRule ^artigos/(.*)$ /artigos/$1 [R=301,L]

但是有些东西不起作用,有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

  

最新信息...该站点使用Joomla CMS。请参见下面的更新

要重定向对不再存在的物理文件的请求,您需要实际检查该文件是否不再存在,否则它将确实“重定向所有内容”(如注释中所述)。

例如,要将未映射到物理文件的格式为/artigos/<something>的任何请求重定向到/artigos/,您可以执行以下操作:

RewriteEngine On

REwriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(artigos/). /$1 [R=302,L]

$1后向引用只是避免了您必须重复目录名称。

检查REDIRECT_STATUS环境的第一个条件旨在确保仅重定向直接请求。这可能仅在您仍使用Apache 2.2(而不是2.4)时才需要,因为mod_dir将首先执行,将重定向的请求重写为index.php(如果存在)并引起重写循环。在Apache 2.4上,mod_dir稍后执行。

使用302测试,只有在确定它可以正常工作时才更改为301-以防止出现缓存问题。

在测试之前,您需要清除浏览器缓存。

但是,404响应通常会更好。搜索引擎可能会看到重定向到软404的通用根目录,并且用户在看不到所请求的信息时更有可能感到“困惑”。

RewriteRule ^artigos/(.*)$ /artigos/$1 [R=301,L]

就其本身而言,这将导致重定向循环,因为它只是重定向至自身。


  

更新:它不是文件,而是Joomla CMS中的一篇文章

如果有效的URL未映射到物理文件,则您无法在.htaccess中执行此操作。在您的情况下,有效的URL由Joomla CMS确定(存储在Joomla数据库中)。 .htaccess在请求一开始就被处理,然后控制权传递给PHP / Joomla。 .htaccess中的伪指令只能查看HTTP请求和物理文件系统。

Joomla使用前控制器模式。所有未映射到物理文件的URL(排除CSS,JS和图像之类的静态资源)都在内部重写为index.php(“前控制器”),从而有效地“路由” URL并确定应该返回什么内容。

您要询问的内容只能在URL映射到文件系统上物理文件的静态网站上完成。

Joomla 确定所请求的URL不存在时,您需要在Joomla本身中执行此重定向。 (无论如何,这实际上效率更高,因为您只需要在确定404之后执行代码,而不是像使用.htaccess那样对每个单个请求执行代码即可。)