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

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

提问人:Vanbel Manik 提问时间:8/17/2022 最后编辑:Vanbel Manik 更新时间:8/24/2022 访问量:183

问:

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

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

页面的页眉和页脚是在不同的目录中构建的。

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

Here is the screenshot

那么,基于此,作为例外的最佳方法是什么?我试图重定向的网站是 .此外,该网站还运行在Fat-Free Framework中。/en/planning/http://source.example/https://www.target.example/

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

html apache .htaccess mod-rewrite fat-free-framework

评论

0赞 CBroe 8/17/2022
这应该可以正常工作,没有立即明显的原因为什么它不应该。这是您的 .htaccess 的全部内容,还是还有更多内容?
0赞 Vanbel Manik 8/18/2022
嗨,CBroe,是的,这是我的.htaccess中唯一的内容,仅此而已。
0赞 MrWhite 8/23/2022
如果这是文件中的唯一内容,那么 URL 应如何通过您的框架进行路由?也许这是错误的文件,或者服务器配置中有指令?.htaccess/en/planning/.htaccess
0赞 Vanbel Manik 8/24/2022
我很确定我在正确的文件中这样做。我修改的 .htaccess 位于 /www/ 目录下。至于服务器配置中的指令,我不确定我是否理解您的意思。
0赞 MrWhite 8/24/2022
想必您无权访问服务器配置?

答:

1赞 MrWhite 8/17/2022 #1
RewriteCond %{REQUEST_URI} !^/en/planning/$
RewriteRule .* https://www.target.example/ [R=301,L]

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

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

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

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

请尝试以下操作:

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

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

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

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

但是,我要补充一点,正如您在这里实现的那样,多对一重定向到主页通常对 SEO 不利,因为搜索引擎(尤其是 Google)会将其视为软 404 并且不遵守重定向,最终从搜索结果中删除页面。

评论

0赞 Vanbel Manik 8/23/2022
嗨,您提供的此代码不起作用。但是确实有一个控制器文件,我只是找不到定义 /en/planning/ 的行。仅供参考,该网站正在使用 Fat-Free Framework
0赞 MrWhite 8/23/2022
@VanbelManik 你说的“不工作”到底是什么意思?此 URL 是否仍在重定向中?没有重定向?重定向格式不正确?某种错误?您是否已确保清除浏览器缓存?(301 - 永久 - 重定向由浏览器永久缓存
0赞 Vanbel Manik 8/24/2022
对不起,我没有澄清“不起作用”的细节。我试图把你上面写的代码放进去,但是当我访问 /en/planning/ 时,服务器返回 404 not found。不过,它确实没有被重定向。
0赞 MrWhite 8/24/2022
@VanbelManik 如果你得到一个 404(并且没有重定向),那么它可以说表明上面的代码“正在工作”,但请求没有通过你的框架路由(一个不同的问题)。如果完全删除此代码,请求“有效”吗?如果你运行的是Apache,并且这是你文件中唯一的代码(如你问题下面的评论所建议的那样),那么请求是如何通过你的框架路由的?您需要文档中建议的前端控制器模式/en/planning/.htaccess