因此,从我们的旧服务器,我们希望几乎所有的网址被重定向到新的服务器,除了少数。
因此,我尝试了以下.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]
这个想法是,除了管理,专辑,歌曲的URL和更新列表php文件和资产文件(css,js,图像),其他一切都应该重定向到新的服务器。
这“几乎”工作得很好-管理URL正确地保留在旧服务器中,update_list也是如此。所有其他遗留URL都重定向到新服务器。
然而,我的问题是albums
和songs
的网址也不断重定向到新的服务器。
我不知道为什么。只是让你知道歌曲的网址是结构
oldserver.com/songs/album-id/song-name
相册URL在加载时具有基于查询参数设置的会话值。
有人能帮助我吗?我已经坐在这个超过4个小时了:(我已经尝试了几乎所有我在网上读到的规则语法。任何建议/指针都非常感谢。
1条答案
按热度按时间nzrxty8p1#
看起来您的
albums
和songs
URL需要在内部重写为“前端控制器”(例如index.php
或其他),以便通过您的应用程序成功路由。如果是这种情况,那么这些URL很可能是在请求被重写到前端控制器之后被重定向的,从而有效地绕过了当前规则中的条件。(虽然您也应该看到一个“畸形”的重定向到“前端控制器,”但原始URL将丢失。是这种情况吗?)
通过检查
REDIRECT_STATUS
环境变量,可以确保只重定向来自客户端的直接请求(而不是“重写”请求),该变量在初始请求中为 empty,在第一次成功重写后设置为“200”(如200 OK HTTP状态)。例如:
您可以使用
REQUEST_URI
而不是REQUEST_FILENAME
来检查文件扩展名。并且不需要检查js
* 和 *Js
,因为比较不区分大小写(即NC
-nocase
)您需要在测试之前清除浏览器缓存,因为错误的301(永久)重定向将被浏览器缓存。
始终首先使用302(临时)重定向进行测试,以避免潜在的缓存问题。