目标:我试图通过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
...
问题出在哪里?
答案 0 :(得分:0)
Apache只会为成功/ 2xx响应代码设置标头。要为任何其他状态代码设置标头,您需要使用always
关键字:
Header always set X-Robots-Tag "noindex, nofollow"
当您的操作是现有标头的功能时,您可能需要指定
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”标题添加到杀死我网站的所有内容中。我希望这有助于将来的某个人。