没有使用RewriteRule设置标头[R = 302,L]

时间:2016-06-09 00:36:37

标签: apache .htaccess redirect http-headers http-status-code-302

目标:我试图通过htaccess设置两个标头:

X-Robots-Tag: noindex, nofollow
Location: http://example.com/foo

PoC:在PHP中,可以做到这一点,效果很好:

header( "X-Robots-Tag: noindex, nofollow", true );
header( "Location: " .  $url, 302 );

问题:在我的.htaccess文件中,我有这个:

# Do not let robots index anything from /out/
RewriteCond %{REQUEST_URI} ^/?out/?
Header set X-Robots-Tag "noindex, nofollow"

...

# Redirect /out/example/ type links
RewriteRule ^/?out/example/(.*)$ "http://example.com/$1" [R=302,L]

我确定某个地方出现了一个我没有看到的简单错误,但如果我检查了http://localhost/out/example/foo的标题,则设置了Location标题,但X-Robots-Tag不是。

HTTP/1.1 302 Found
Date: Wed, 08 Jun 2016 23:59:18 GMT
Content-Type: text/html; charset=iso-8859-1
Transfer-Encoding: chunked
Connection: close
Location: http://example.com/foo
...

然而,触发404(例如http://localhost/out/404)将设置适当的标题:

HTTP/1.1 404 Not·Found
Date: Wed, 08 Jun 2016 23:56:19 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
Vary: Accept-Encoding,User-Agent
X-Robots-Tag: noindex, nofollow    <--- set
...

问题出在哪里?

2 个答案:

答案 0 :(得分:0)

Apache只会为成功/ 2xx响应代码设置标头。要为任何其他状态代码设置标头,您需要使用always关键字:

Header always set X-Robots-Tag "noindex, nofollow"

More Information

  

当您的操作是现有标头的功能时,您可能需要指定always的条件,具体取决于设置原始标头的内部表格。与always对应的表格用于本地生成的错误响应以及成功的响应。另请注意,在某些情况下重复使用这两个条件是有意义的,因为always不是onsuccess关于现有标头的超集:

     
      
  • 您正在为本地生成的非成功(非2xx)响应添加标头,例如重定向,在这种情况下,只会在最终响应中使用与always相对应的表。 / em>的
  •   
  • 您正在修改或删除由CGI脚本生成的标头,在这种情况下,CGI脚本位于对应于始终而不是默认表中的表中。
  •   
  • 您正在修改或删除某些服务器生成的标头,但默认的onsuccess条件未找到该标头。
  •   

答案 1 :(得分:0)

解决方案是执行以下操作:

# Redirect /out/example/ type links
RewriteRule ^/?out/example/(.*)$ "http://example.com/$1" [R=302,L,E=OUTLINK:1]

# Add the robots header if E was set above
Header always set X-Robots-Tag "noindex, nofollow" env=OUTLINK

注意:这是一个挑战,因为最初的解决方案是将“noindex”标题添加到杀死我网站的所有内容中。我希望这有助于将来的某个人。