Apache 关于使用重写规则&;{REQUEST_URI}变量将所有旧域重定向到新域
使用正确吗Apache 关于使用重写规则&;{REQUEST_URI}变量将所有旧域重定向到新域,apache,.htaccess,mod-rewrite,http-status-code-301,http-redirect,Apache,.htaccess,Mod Rewrite,Http Status Code 301,Http Redirect,使用正确吗 RewriteRule .? http://www.newdomain.com%{REQUEST_URI} [L,R=301] 是否将所有页面从旧域重定向到新域(包括404) 我把它放在我的一个htaccess中。它能起作用,但我不知道它是否正确。它会起作用,但我不会这样做。?的意思是“URL包含任何内容的0或1”,这是一种匹配所有内容的稍微奇怪的方式 我的方法是“捕获”匹配的URL并在目标中使用它 RewriteRule ^(.*)$ http://www.newdomain
RewriteRule .? http://www.newdomain.com%{REQUEST_URI} [L,R=301]
是否将所有页面从旧域重定向到新域(包括404)
我把它放在我的一个htaccess中。它能起作用,但我不知道它是否正确。它会起作用,但我不会这样做。
?
的意思是“URL包含任何内容的0或1”,这是一种匹配所有内容的稍微奇怪的方式
我的方法是“捕获”匹配的URL并在目标中使用它
RewriteRule ^(.*)$ http://www.newdomain.com$1 [L,R=301]
这里,*
表示“匹配任何内容”,^
和$
表示URL的开始和结束,使其“匹配所有内容”,$1
表示第一组括号中匹配的内容
现在我看它似乎更复杂了,但它更类似于仅匹配某些URL或以不同方式构造目标时所需的规则。OP使用请求URI的解决方案比使用常见的^(.*)$和$1更好 原因:
- 请求URI正确地保留了缺少尾部斜杠的路径($1不这样做)。因此,
将完全重定向到olddomain.com/path
。仅使用$1时,newdomain/path
将重定向到olddomain.com/path/
,但缺少尾部斜杠的路径段将被删除newdomain/path/
- REQUEST_URI正确地保留了任何查询字符串,这将需要$1解决方案的附加QSA标志
使匹配图案更短。一个插入符号就足以匹配任何内容:
RewriteRule ^ http://www.newdomain.com%{REQUEST_URI} [L,R=301]
虽然这个方法也可以工作,但是OP中的方法更有效,因为1)它不必匹配整个URL,它只检查是否有任何请求,2)不需要创建反向引用来捕获Apache从一开始就知道的内容(值
%{REQUEST_URI}
)@scalliox这是一个很好的观点。我想我是从人的效率的角度(可读性和可维护性)思考的:将所有内容保持在熟悉的形式中,可以根据不同的情况轻松修改(例如将子目录重定向到自己的域)。