.htaccess 你能重命名robots.txt和favicon吗?

sbtkgmzw  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(134)

我希望在我的服务器中有如下名称:(因此,所有服务器设置和爬虫程序都是从。在文件列表中首先显示,然后在文件列表中显示我的网页文件。)

.favicon.ico
.htaccess
.robots.txt
.sitemap.xml
index.php
contact.php

字符串
下面是.htaccess的内容:

Redirect 301 "/robots.txt" "/.robots.txt"
Redirect 301 "/favicon.ico" "/.favicon.ico"


下面是文件“. robots.txt”的内容:

User-Agent: *
Sitemap: http://example.com/.sitemap.xml
Allow: https://example.com/index.php
Allow: https://example.com/contact.php


这样可以吗?一切都会正常运行吗?网站图标怎么样?这样可以吗?提前感谢!

k4ymrczo

k4ymrczo1#

是的,您可以重命名robots.txtfavicon.ico,但是,您应该将其实现为内部重写,而不是外部重定向(这会创建不必要的额外请求)。我也会考虑使用一个不同的字符前缀,而不是一个点,这通常表示一个“隐藏/保护”的文件(如.htaccess),可能不会显示在FTP客户端默认情况下。在服务器配置中可能已经有了阻止访问点文件的指令。(也许可以使用@,我将在下面的示例中使用它。
您通常不会因为上述原因重命名robots.txt(和favicon.ico)文件(只是为了影响目录中文件的顺序)。这可能会让其他开发人员感到困惑。但是,当您需要根据请求的元素(例如,请求的内容)有条件地提供不同的robots.txt文件时,“重命名”robots.txt文件是非常常见的。也许你有multiple domains being served from the same hosting account and you need different robots.txt files或者也许你需要disallow crawling of some domains and allow others)。
要重写请求,您需要使用mod_rewrite。举例来说:

RewriteEngine On

# Rewrite from "robots.txt" to "@robots.txt"
RewriteRule ^favicon\.ico$ @favicon.ico [L]
RewriteRule ^robots\.txt$ @robots.txt [L]

字符串
它可以被“简化”为一个单一的规则,避免重复:

# Rewrite from "robots.txt" to "@robots.txt"
RewriteRule ^(robots\.txt|favicon\.ico)$ @$1 [L]


$1是在前面的RewriteRule * 模式 * 中捕获的URL路径的反向引用,即robots.txtfavicon.ico,具体取决于请求。
对于用户代理(浏览器/搜索引擎机器人),“内部重写”是不可见的。就好像文件分别被称为robots.txtfavicon.ico
但是,也要考虑阻止对这些@-文件的直接访问。将@robots.txt的请求重定向到robots.txt。例如,下面的代码需要在上面的重写之前进行 *:

# Redirect from "@robots.txt" to "robots.txt"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^@(robots\.txt|favicon\.ico)$ /$1 [R=301,L]


REDIRECT_STATUS环境变量的检查确保只处理来自客户端的直接请求,而不处理上述重写的内部重写请求。
如果你对sitemap.xml做同样的事情(即all @-files),则规则可以简化,因为您只需要检查@前缀,而不需要显式匹配文件名。举例来说:

# Redirect and remove the "@" prefix from all requests
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^@([^/]+)$ /$1 [R=301,L]


参考文件:

  • https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewriterule

不重命名文件,而是移动其他(内容)文件

或者,与其在根目录中重命名这些文件,为什么不将所有内容(.php文件)放在一个子目录中(例如:/content),并将根目录中所有对.php文件的请求重写到该子目录?举例来说:

# Internally rewrite "contact.php" to "/content/contact.php"
RewriteCond %{DOCUMENT_ROOT}/content/$1 -f
RewriteRule ^([^/]+\.php)$ content/$1 [L]


前面的 conditionRewriteCond指令)在重写请求之前检查/content子目录中的目标文件是否存在。然后,从可见URL中删除.php扩展是一项简单的任务。例如,将上述规则替换为:

# Internally rewrite "contact" to "/content/contact.php"
RewriteCond %{DOCUMENT_ROOT}/content/$1.php -f
RewriteRule ^([^/]+)$ content/$1.php [L]

robots.txt

User-Agent: *
Sitemap: http://example.com/.sitemap.xml
Allow: https://example.com/index.php
Allow: https://example.com/contact.php


这里不需要Allow指令(因为默认值为“allow”)。但是,Allow(和Disallow)指令采用根相对URL路径,而不是绝对URL。也就是说,它应该是/index.php,而不是https://example.com/index.php-后者不会做任何事情,因为它永远不会匹配。(此处还混合了httphttps。)

相关问题