Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 关于使用重写规则&;{REQUEST_URI}变量将所有旧域重定向到新域_Apache_.htaccess_Mod Rewrite_Http Status Code 301_Http Redirect - Fatal编程技术网

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
    将完全重定向到
    newdomain/path
    。仅使用$1时,
    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这是一个很好的观点。我想我是从人的效率的角度(可读性和可维护性)思考的:将所有内容保持在熟悉的形式中,可以根据不同的情况轻松修改(例如将子目录重定向到自己的域)。