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

42fyovps  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(85)

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

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位于/home/indo/www/目录中,在这个目录中,有一个指向原始位置的快捷方式,名为“front”。

那么,在此基础上,什么是使/en/planning/成为例外的最好方法呢?我尝试重定向的网站是http://source.example/https://www.target.example/。此外,该网站运行的是Fat-Free框架。
我已经被困在这里几个星期了,这是令人沮丧的。

djmepvbi

djmepvbi1#

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

毫无疑问,您还有其他指令(一个front-controller模式)将/en/planning/的URL重写到执行底层路由的front-controller,您的front-controller可能是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]

REDIRECT_STATUS环境变量的检查确保我们只测试来自客户端的初始请求,而不是Apache重写的请求。
REQUEST_FILENAME的额外检查确保了请求的URL不会Map到实际的文件(静态资源)。然而,这样做的明显缺点是静态资源(用于其他页面)不会被重定向。
您还需要确保浏览器缓存已被清除,因为错误的301(* 永久 *)重定向将被浏览器缓存。首先测试302(临时)重定向以避免潜在的缓存问题。
我想补充的是,然而,一个多对一重定向到主页,正如你在这里实现的一般是不好的搜索引擎优化,因为搜索引擎(特别是谷歌)会看到这是一个软-404和不尊重重定向,最终从搜索结果中删除页面。

相关问题