robots.txt 和 htaccess(而 CMS 位于子文件夹中)

robots.txt and htaccess (while CMS is in sub-folder)

我的 CMS 位于一个子文件夹中,因此我通过 .htaccess 转发所有内容。对于 cms 来说很好,下面的代码片段可以毫无问题地工作,但对于像 robots.txt 这样必须存储在 Web 根目录中的文件(例如 https://domain.xyz/robots.txt)是不利的。如果我调用 URL 浏览器和爬虫将(当然)转发到 https://domain.xyz/TEST

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{HTTPS} !=on
    RewriteRule ^ https://domain.xyz%{REQUEST_URI} [L,R=301]

    RewriteCond %{HTTP_HOST} !^domain\.xyz$ [NC]
    RewriteRule ^ https://domain.xyz/TEST [L,R=301]

    RewriteCond %{REQUEST_URI} !^/TEST
    RewriteRule ^ https://domain.xyz/TEST [L,R=301]
</IfModule>

所以我必须跳过那个文件,我会添加

RewriteCond %{THE_REQUEST} !/(robots\.txt|sitemap\.xml)\s [NC]

对于 RewriteRule 之前的文件 robots.txt 和 sitemap.xml,但它不起作用。怎么了?有人可以帮我吗?谢谢。

可以说,这不是“转发”,而是“重定向”,如 外部重定向转发更常用于描述内部重写(其中URL不变)。

but bad for files like robots.txt, which have to be stored in the web root

不一定。它们 不需要 存储在网络根目录中(并从中访问)。 Google 和其他搜索引擎在请求 robots.txt、XML 站点地图和类似文件时会遵循重定向。来自 Google Docs for robots.txt - "Handling of errors and HTTP status codes":

3xx (redirection)
Google follows at least five redirect hops as defined by RFC 1945 and then stops and treats it as a 404 for the robots.txt.

但是,如果您愿意,您仍然可以包含异常,但是您的正则表达式中有错误...

RewriteCond %{THE_REQUEST} !/(robots\.txt|sitemap\.xml)\s [NC]

您在 CondPattern 末尾有一个错误的 \s(字面 space 字符)-所以这永远不会匹配并且 condition 总是成功的。也许你打算写 $ (end-of-string 锚点)?您还缺少 start-of-string 锚点。

例如应该是:

RewriteCond %{THE_REQUEST} !^/(robots\.txt|sitemap\.xml)$ [NC]

或者,在现有规则规则 之前包含一个积极的匹配,以防止任何以后的规则(即重定向)发生时请求这些文件之一:

# Prevent further processing if "robots.txt" or "sitemap.xml" requested
RewriteRule ^(robots\.txt|sitemap\.xml)$ - [NC,L]
RewriteRule ^ https://domain.xyz/TEST [L,R=301]

因为 TEST 是一个物理目录,你应该在重定向的 URL 后面附加一个斜杠,即。 /TEST/,否则 Apache (mod_dir) 将在尾部斜杠后附加 second 重定向。

您需要在测试前清除浏览器缓存,因为浏览器会缓存 301(永久)重定向。