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

Posted

技术标签:

【中文标题】使用 .htaccess 和正则表达式重定向损坏的 404 页面【英文标题】:Redirect broken 404 pages with .htaccess and regular expressions 【发布时间】:2019-07-04 02:36:38 【问题描述】:

我一直在我的网站上取消发布旧页面。为避免出现 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]

但是有些东西不起作用,谁能帮忙?

【问题讨论】:

试试RewriteRule ^/?artigos/.+$ /artigos/ [R=301,L] 非常感谢,但这是重定向所有内容,而不仅仅是错误 错误是什么意思?这就是您尝试做的正确形式。 你也可以看到这个***.com/questions/2363520/… 在 Joomla 中使用内置系统。不要乱用重写规则。使用内置系统,您可以跟踪这种情况发生的频率等。 【参考方案1】:

迟到的信息...该网站使用 Joomla CMS。请参阅下面的更新

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

例如,要将/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 那样在每个请求上执行。)

【讨论】:

谢谢,但它仍在重定向 artigos/ 下的所有内容。例如,这是一个有效的 URL,它正在重定向:portal-gestao.com/artigos/… 8082-rfm-recency,-frequency-e-monetary-value-como-aplicar-o-clustering-com-o-power-bi.html作为物理文件存在于/artigos子目录中?! 您好,这不是文件,是 Joomla CMS 中的文章 啊,如果这是一个 CMS,其中的 URL 是完全“虚拟的”并且不映射到物理文件,那么您不能在 .htaccess 中执行此操作。我已经更新了我的答案。

以上是关于使用 .htaccess 和正则表达式重定向损坏的 404 页面的主要内容,如果未能解决你的问题,请参考以下文章

在 htaccess 中使用正则表达式进行 301 重定向

htaccess正则表达式301重定向

.htaccess重定向查询字符串

高分求301重定向的htaccess规则写法

.htaccess 重定向规则相同的域但不同的前缀

.htaccess中带?参数的重定向伪静态写法