繁体   English   中英

尝试使用.Htaccess 到 301 重定向除一个以外的所有页面。 但是,一页例外规则不起作用

[英]Trying to Use .Htaccess to 301 redirect all pages but one. However The One Page Exception Rule is Not Working

我一直在尝试将我网站的所有页面重定向到一个新网站,但希望排除一个页面作为例外。 这是我正在使用的代码:

RewriteEngine On

RewriteCond %{REQUEST_URI} !^/en/planning/$
RewriteRule .* https://www.target.example/ [R=301,L]

如您所见,我正在尝试将所有页面重定向到新域,但保持/en/planning/页面不变。 但是,当我使用上面的代码时,所有页面都被重定向,无一例外。 从服务器上,我发现/en/planning目录实际上并不存在。 然而,该页面的模板存在于不同的目录中。

他们在这里 > /home/indo/src-20220316-200538/apps/front/templates/planning/views/planning-view.html

页面的 header & 页脚构建在不同的目录中。

同时网站的public_html位于/home/indo/www/这个目录下,有一个指向原位置的快捷方式,名为“front”。 这是 WinSCP 的屏幕截图:

这是屏幕截图

那么,基于此,将/en/planning/作为例外的最佳方法是什么? 我要重定向的网站是http://source.example/https://www.target.example/

我已经被困在这里好几个星期了,这令人沮丧。

RewriteCond %{REQUEST_URI}.^/en/planning/$ RewriteRule:* https.//www.target,example/ [R=301,L]

毫无疑问,您还有其他指令(前端控制器模式)将/en/planning/形式的 URL 重写到执行底层路由的前端控制器。 您的前置控制器可能是index.php或其他。

这里的“问题”是当请求被重写到前端控制器时, REQUEST_URI服务器变量不再是/en/planning/ ,而是更新为/index.php (或任何前端控制器)和发生重定向,因为否定条件现在成功。 重写引擎进行多次传递,不需要的重定向很可能发生在第二次传递(异常最初是成功的)。

您需要确保只检查最初请求的 URL 而不是重写的 URL。

但是,您也可能需要为该页面使用的任何 static 资源(图像、CSS、JS 等)设置一个例外,否则这些资源也会被重定向。

请尝试以下操作:

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_URI} !^/en/planning/$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ https://www.target.example/ [R=301,L]

REDIRECT_STATUS环境变量的检查确保我们只测试来自客户端的初始请求,而不是 Apache 的重写请求。

针对REQUEST_FILENAME的附加检查确保请求的 URL 不会 map 到实际文件(static 资源)。 但是,这样做的明显缺点是不会重定向 static 资源(用于其他页面)。

您还需要确保清除浏览器缓存,因为错误的 301(永久)重定向将被浏览器缓存。 首先使用 302(临时)重定向进行测试,以避免潜在的缓存问题。

但是,我要补充一点,您在此处实施的多对一重定向通常对 SEO 不利,因为搜索引擎(尤其是 Google)最终会将其视为软 404 并且不尊重重定向从搜索结果中删除页面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM