使用 .htaccess 和正则表达式重定向损坏的 404 页面
Redirect broken 404 pages with .htaccess and regular expressions
我一直在取消发布我网站上的旧页面。为了避免 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/ [R=301,L]
但是有些东西不起作用,有人可以帮忙吗?
Late information... the site uses a Joomla CMS. See the UPDATE below.
要重定向对不再存在的物理文件的请求,您需要实际检查该文件是否不再存在,否则它确实会 "redirect everything"(如评论中所述)。
例如,要将任何未映射到物理文件的 /artigos/<something>
形式的请求重定向到 /artigos/
,您可以执行以下操作:
RewriteEngine On
REwriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(artigos/). / [R=302,L]
</code> 反向引用只是防止您重复目录名称。</p>
<p>检查 <code>REDIRECT_STATUS
环境的第一个条件旨在确保仅重定向直接请求。这可能仅在您仍在使用 Apache 2.2(而不是 2.4)时才需要,因为 mod_dir 将首先执行,将重定向的请求重写为 index.php
(如果存在)并导致重写循环。在 Apache 2.4 上,mod_dir 稍后执行。
使用 302 进行测试,只有当您确定它工作正常时才更改为 301 - 以防止缓存问题。
测试前您需要清除浏览器缓存。
但是,404 通常是更好的响应。搜索引擎可能会将重定向到公共根目录视为 soft-404,并且当用户看不到他们请求的信息时,他们更有可能 "confused"。
RewriteRule ^artigos/(.*)$ /artigos/ [R=301,L]
这本身会导致重定向循环,因为它只是重定向到自身。
UPDATE: it's not a file, it is an article in a Joomla CMS
如果有效的 URL 没有映射到物理文件,那么您不能在 .htaccess
中执行此操作。在您的情况下,有效的 URL 由 Joomla CMS 确定(存储在 Joomla 数据库中)。 .htaccess
在请求的最开始处理,然后控制传递给 PHP/Joomla。 .htaccess
中的指令只能查看 HTTP 请求和物理文件系统。
Joomla 使用前端控制器模式。所有不映射到物理文件的URLs(排除CSS、JS和图像等静态资源)在内部重写为index.php
("front-controller"),这有效地 "routes" URL 并决定应返回哪些内容。
您的要求只能在静态网站上完成,其中 URLs 映射到文件系统上的物理文件。
当 Joomla 确定所请求的 URL 不存在时,您需要在 Joomla 本身中执行此重定向。 (无论如何,这实际上更有效,因为您只需要在确定 404 后执行您的代码,而不是像使用 .htaccess
时那样在每个请求上执行。)
我一直在取消发布我网站上的旧页面。为了避免 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/ [R=301,L]
但是有些东西不起作用,有人可以帮忙吗?
Late information... the site uses a Joomla CMS. See the UPDATE below.
要重定向对不再存在的物理文件的请求,您需要实际检查该文件是否不再存在,否则它确实会 "redirect everything"(如评论中所述)。
例如,要将任何未映射到物理文件的 /artigos/<something>
形式的请求重定向到 /artigos/
,您可以执行以下操作:
RewriteEngine On
REwriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(artigos/). / [R=302,L]
</code> 反向引用只是防止您重复目录名称。</p>
<p>检查 <code>REDIRECT_STATUS
环境的第一个条件旨在确保仅重定向直接请求。这可能仅在您仍在使用 Apache 2.2(而不是 2.4)时才需要,因为 mod_dir 将首先执行,将重定向的请求重写为 index.php
(如果存在)并导致重写循环。在 Apache 2.4 上,mod_dir 稍后执行。
使用 302 进行测试,只有当您确定它工作正常时才更改为 301 - 以防止缓存问题。
测试前您需要清除浏览器缓存。
但是,404 通常是更好的响应。搜索引擎可能会将重定向到公共根目录视为 soft-404,并且当用户看不到他们请求的信息时,他们更有可能 "confused"。
RewriteRule ^artigos/(.*)$ /artigos/ [R=301,L]
这本身会导致重定向循环,因为它只是重定向到自身。
UPDATE: it's not a file, it is an article in a Joomla CMS
如果有效的 URL 没有映射到物理文件,那么您不能在 .htaccess
中执行此操作。在您的情况下,有效的 URL 由 Joomla CMS 确定(存储在 Joomla 数据库中)。 .htaccess
在请求的最开始处理,然后控制传递给 PHP/Joomla。 .htaccess
中的指令只能查看 HTTP 请求和物理文件系统。
Joomla 使用前端控制器模式。所有不映射到物理文件的URLs(排除CSS、JS和图像等静态资源)在内部重写为index.php
("front-controller"),这有效地 "routes" URL 并决定应返回哪些内容。
您的要求只能在静态网站上完成,其中 URLs 映射到文件系统上的物理文件。
当 Joomla 确定所请求的 URL 不存在时,您需要在 Joomla 本身中执行此重定向。 (无论如何,这实际上更有效,因为您只需要在确定 404 后执行您的代码,而不是像使用 .htaccess
时那样在每个请求上执行。)