htaccess URL重定向排除了几个URL



因此,我们希望从旧服务器将几乎所有URL重定向到新服务器,只有少数URL除外。

所以我尝试了以下.htaccess规则:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !.(css|js|Js|png|jpg|gif)$ [NC]
RewriteCond %{REQUEST_URI} !^/admin/
RewriteCond %{REQUEST_URI} !^/albums/
RewriteCond %{REQUEST_URI} !^/songs/
RewriteCond %{REQUEST_URI} !^/update_list.php
RewriteRule (.*) http://www.newserver.com/$1 [R=301,L]

这个想法是,除了admin、相册、歌曲URL和update_listphp文件以及资产文件(css、js、images(之外,其他所有内容都应该重定向到新服务器。

这项工作";几乎";fine-adminURL正确地保留在旧服务器中,update_list也是如此。所有其他遗留URL重定向到新服务器。

然而,我的问题是albumssongs的URL也一直重定向到新服务器。

我不知道为什么。只是为了让你知道歌曲的url是结构

oldserver.com/songs/album-id/song-name

相册URL具有基于加载时的查询参数设置的会话值。

有人能帮我吗?我已经坐了4个多小时了:(我几乎尝试了我在网上读到的所有类型的规则语法。任何建议/建议都非常感谢。

看起来您的albumssongsURL需要在内部重写为";前控制器";(例如index.php或其他(,以便通过您的应用程序成功路由。

如果是这种情况,那么这些URL很可能在请求被重写到前端控制器后被重定向到,从而有效地绕过了当前规则中的条件。(尽管你也应该看到"格式错误"的重定向到"前端控制器",但原始URL会丢失。是这样吗?(

您可以通过检查REDIRECT_STATUS环境变量来确保仅重定向来自客户端的直接请求(而不是"重写"请求(,该变量在初始请求中为,并设置为"重写";200〃;(如在200 OK HTTP状态下(。

例如:

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_URI} !.(css|js|png|jpg|gif)$ [NC]
RewriteCond %{REQUEST_URI} !^/admin/
RewriteCond %{REQUEST_URI} !^/albums/
RewriteCond %{REQUEST_URI} !^/songs/
RewriteCond %{REQUEST_URI} !^/update_list.php
RewriteRule (.*) http://www.newserver.com/$1 [R=301,L]

您可以使用REQUEST_URI而不是REQUEST_FILENAME来检查文件扩展名。并且不需要检查jsJs,因为比较不区分大小写(即NC-nocase(

在测试之前,您需要清除浏览器缓存,因为错误的301(永久(重定向将被浏览器缓存。

始终首先使用302(临时(重定向进行测试,以避免潜在的缓存问题。

最新更新