如何禁用空主机头

禁用Nginx和Apache空主机头的方法,
本文介绍了如何在Nginx和Apache中禁止空主机头,防止恶意域名解析。方法包括在Nginx中返回500错误、URL重写以及在Apache中添加特定虚拟主机配置,确保只有预期的主机头可以访问网站。

本文为joshua317原创文章,转载请注明:转载自joshua317博客 如何禁用空主机头 - joshua317的博客

一、Nginx 空主机头禁止

如果 Nginx 配置了空主机头,那么任意域名解析指向到服务器IP,都可以访问站点,为了防止域名解析恶意指向主机,可以将 Nginx 默认的空主机头禁止,方法是通过修改 Nginx 的主配置文件 nginx.conf ,使其主机头返回错误信息 500

nginx配置默认路径:/usr/local/nginx/conf/nginx.conf

  1. 直接屏蔽未绑定域名的虚拟主机访问,返回500错误(这个错误信息可以自定义):
server
{
     listen  80;
     return 500;
}
  1. 可以做一个URL重写,把访问的流量导入到需要的网站,比如说网站的主页,配置的时候https://www.joshua317.net替换成需要的URL即可:
server
{
  listen 80 default;
  rewrite ^(.*) http://www.joshua317.com permanent; 
}
  1. 禁止空主机头的同时也禁止通过IP访问,可以写成:
server
{
  listen 80 default;
  server_name _;
  return 500;
}

这里的配置需要添加到 nginx 主配置文件里,和主配置文件的 server 并列成同一层级,可以参考下图:

二、Apache 空主机头禁止

防止域名解析,禁止apache默认的空主机头: apache配置默认路径:/etc/httpd/conf/httpd.conf

  1. 编辑配置文件,在站点配置之前再增加一个站点(上面是需要增加的站点配置,下面是正在使用的站点配置)
<VirtualHost *:80>
ServerName *****
ErrorDocument 404 /404.html
<Directory />
Options Indexes FollowSymLinks
AllowOverride None
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName www.joshua317.com
DocumentRoot "/var/www/html"
</VirtualHost>
  1. apache将第一个virtualhost作为默认配置,然后依次向下查找,如果有匹配中的,则采用新匹配到的配置项

这样就可以将允许的访问主机头之外的恶意解析请求拦截在外;

本文为joshua317原创文章,转载请注明:转载自joshua317博客 如何禁用空主机头 - joshua317的博客

<think>嗯,用户询问的是Keil MDK中禁用半主机和取消勾选禁用半主机的方法。这个问题在嵌入式开发中很常见,特别是使用STM32等ARM芯片时。 用户提到的引用内容很有参考价值,特别是引用[2]和[5]直接相关。引用[2]详细解释了半主机模式的问题和两种解决方法:使用MicroLIB或重定向标准I/O函数。引用[5]则提供了使用HAL库重定向fputc的示例代码。其他引用虽然提到了一些相关概念,但主要解决的是不同的问题。 考虑到用户可能正在调试串口输出问题,需要明确区分禁用半主机的两种主要方式: 1. 使用MicroLIB方案:最简单的方法是在工程配置中勾选"Use MicroLIB"选项,这样可以避免半主机依赖,但要注意MicroLIB是简化版库,可能会缺少某些功能。 2. 标准库重定向方案:更适合需要完整标准库功能的情况,需要在代码中实现fputc/fgetc等函数的重定向,并禁用半主机模式。 用户可能还不太清楚这两种方法的区别和适用场景,需要解释清楚。另外引用[4]提到使用MicroLIB可能导致assert报错等问题,这也是需要提醒用户的注意事项。 准备在回复中分步骤说明两种禁用方法,并补充取消禁用的操作。考虑到用户可能是调试时遇到问题,特别强调优化级别对调试的影响(引用[3]的内容),这个细节很重要但容易被忽略。 用户应该需要具体的操作指导,所以会提供详细的菜单路径和代码示例,特别是重定向函数的HAL库和标准库两种写法。最后会给出选择建议,帮助用户根据实际情况决定方案。 </think>在Keil MDK中处理半主机模式主要有两种方法,以下是具体操作指南: ### ✅ 一、禁用半主机模式的方法 #### 方法1:启用MicroLIB(推荐) 1. **工程配置** - 打开工程后右键点击`Target` → 选择`Options for Target` - 在`Target`选项卡 → `Code Generation`区域 - 勾选✅ `Use MicroLIB` - 点击`OK`保存 *说明:MicroLIB是简化版C库,默认不依赖半主机模式[^2][^4]* 2. **代码修改**(需重定向标准I/O) ```c // 串口重定向示例(以USART1为例) int fputc(int ch, FILE *f) { while(!(USART1->SR & USART_SR_TXE)); // 等待发送完成 USART1->DR = (uint8_t)ch; // 发送字符 return ch; } ``` *注:若用HAL库,替换为`HAL_UART_Transmit()`[^5]* #### 方法2:手动禁用半主机(不启用MicroLIB时) ```c // 在main.c添加以下代码 #pragma import(__use_no_semihosting) // 禁用半主机链接 // 必须实现的系统级函数 void _sys_exit(int x) { while(1); } // 避免链接半主机退出函数 void _ttywrch(int ch) { } // 实现避免警告 // 仍需重定向fputc/fgetc(同上) ``` *原理:强制断开与半主机库的链接[^2][^5]* --- ### 🔄 二、取消禁用半主机模式(恢复默认) 1. **取消MicroLIB** - `Options for Target` → `Target`选项卡 - 取消`Use MicroLIB`的勾选 - 删除工程中的重定向代码(如fputc/fgetc) 2. **恢复半主机依赖** - 移除`#pragma import(__use_no_semihosting)`指令 - 删除`_sys_exit`等函数实现 - 确保使用完整标准库(默认配置) --- ### ⚠️ 关键注意事项 1. **调试优化冲突** 若启用高优化等级(-O2/-O3),局部变量可能无法调试,需暂时设为`-O0`[^3] 2. **MicroLIB的局限性** - 不支持某些标准库功能(如文件操作) - 可能触发`assert`等函数报错[^4] - 占用内存更少(适合资源紧缺设备) 3. **串口初始化优先级** 重定向前必须初始化UART,建议在`main()`开头调用`HAL_UART_Init()` --- ### 📚 选择建议 | **场景** | **推荐方案** | |-------------------------|-------------------| | 资源受限设备 | MicroLIB + 重定向 | | 需完整标准库功能 | 手动禁用半主机 | | 需JTAG调试输出 | 保持半主机启用 | > 调试时若遇局部变量不可见,请检查:优化等级是否为`-O0`,并确认未启用`Link-Time Optimization`[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值