使用 .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 页面的主要内容,如果未能解决你的问题,请参考以下文章