我一直在网站上取消发布旧页面。为了避免出现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]
但是有些东西不起作用,有人可以帮忙吗?
答案 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
那样对每个单个请求执行代码即可。)