因此,我们希望从旧服务器将几乎所有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重定向到新服务器。
然而,我的问题是albums
和songs
的URL也一直重定向到新服务器。
我不知道为什么。只是为了让你知道歌曲的url是结构
oldserver.com/songs/album-id/song-name
相册URL具有基于加载时的查询参数设置的会话值。
有人能帮我吗?我已经坐了4个多小时了:(我几乎尝试了我在网上读到的所有类型的规则语法。任何建议/建议都非常感谢。
看起来您的albums
和songs
URL需要在内部重写为";前控制器";(例如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
来检查文件扩展名。并且不需要检查js
和Js
,因为比较不区分大小写(即NC
-nocase
(
在测试之前,您需要清除浏览器缓存,因为错误的301(永久(重定向将被浏览器缓存。
始终首先使用302(临时(重定向进行测试,以避免潜在的缓存问题。