我希望重定向所有 URL,但根目录中的站点地图 xml 文件除外。htaccess 应该允许 https://old-domain/xml.xml 使用 HTTP 200 进行解析,但目前它仍在重定向到新域。我如何从重定向中排除文件 (xml.xml)?
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/xml\.xml$
RewriteCond %{HTTP_HOST} ^old-domain\.de$ [OR]
RewriteCond %{HTTP_HOST} ^www\.old-domain\.de$
RewriteRule (.*)$ https://new-domain.de/$1 [R=301,L]
</IfModule>
答案1
RewriteRule ^xml.xml/?$ /xml.xml [NC,L]
我实际上预计这会导致重写循环(500 内部服务器错误响应),因为代换字符串(表示 URL 路径)。
您可能会看到之前实施的 301 导致的缓存重定向永恒的重定向。301 会被浏览器永久缓存。(这就是为什么您应该始终使用 302(临时)重定向进行测试。)
您不应该重写相同的 URL,而应该根本不重写请求。这可以通过-
在代换细绳。
另外,我假设您没有在请求中包含尾部斜杠,因此正则/?
表达式中的是多余的。 (.xml
文件的默认处理程序无论如何都不允许路径信息,因此尾部斜杠可能会导致 404 - 除非重写。)
这里的标志NC
应该是不必要的 - 您应该始终使用规范的 URL(我认为全部都是小写的)。
因此,上述规则应该改写如下:
RewriteRule ^xml\.xml$ - [L]
(请记住在正则表达式中用反斜杠转义文字点。)
这将阻止在请求时处理任何进一步的 mod_rewrite 指令/xml.xml
。
您的杂乱结束</IfModule>
标记是否意味着您还有其他指令?不用说,这些重定向需要放在文件顶部附近.htaccess
。
测试前请清除浏览器(以及任何中间)缓存。测试时请打开浏览器检查器并在“网络”选项卡上选中“禁用缓存”。
选择
由于您只想排除一个 URL/文件被重定向,因此您可以将其作为现有重定向的一部分,作为额外的例外。
例如:
RewriteCond %{REQUEST_URI} !^/xml\.xml$
RewriteCond %{HTTP_HOST} ^(www\.)?old-domain\.de [NC]
RewriteRule (.*) https://new-domain.de/$1 [R=301,L]
前缀!
否定了正则表达式。因此,当请求的 URL 与正则表达式不匹配时,它会成功^/xml\.xml$
。
或者,避免需要额外的状况:
RewriteCond %{HTTP_HOST} ^(www\.)?old-domain\.de [NC]
RewriteRule !^xml\.xml$ https://new-domain.de%{REQUEST_URI} [R=301,L]