再谈 apache设置virtualhost + apache的一些相关设值

首先 要弄懂究竟什么是, vitrual host: 虚拟主机, 他有什么用处?
就是说: 一台计算机(server)中, 通常只是放一个网站/站点 但是 如果机器紧张, 服务器性能比较好,或访问的站点压力不是很大 就可以在一台机器上 搭建多个站点. 就相当于, 原来每个房间都弄一台空调. 现在 一台空调" 一拖二""一拖三"等.

在机器上安装apache后, apache成为网站的引擎. (这个引擎就相当于 一个单位外事部的经理, 对外办公室的主任一样), 他就负责http远程访问的事情(应用). 要不然凭什么外部来的请求能够访问得到站点上的内容呢? 就是由他: 第一, 负责监听本机 80 端口的 远程的http请求. ( 具体是哪个端口, 由httpd.conf中的配置来决定. 你也可以修改httpd.conf来改变本机web http(s)请求数据包的监听 : lisen 80(8080, 7000等). 第二,然后, apache把httpd.conf 配置中的 DocumentRoot指定目录中的 "默认索引"文件index.html 或index.php等发往 http外发端口(这个外发端口)就是随机的临时指定的了. 第三, 然后, 再往osi七层模型中的底层打包 封帧进行传递. 也就说说, 所谓的Apache就是干这事的. 有了apache,就相当于成立了外事办 .就有了外事办 主任, 就可以向外提供http web服务了. 否则, 没有apache, 那肯定就没有web服务的功能了. 你看apache的代码, 基本上就是 这些: 网络功能模块: 连接请求监听(轮询机制) , 建立网络连接, 准备数据, 决定随机外发端口, 封包, 封帧, 外发....

一个apache可以处理一个网站/站点的业务/事情, 跟外事办同理, 一个单位的(专门成立的一个)外事办, 可以处理多个部门的外事活动/事务. 比如工程部, 市场部, 客服部, 技术部等多个部门的外事活动, 都将由外事办来处理, 因此, 一个机器上的一个apache也可以处理 本机上 多个网站的 网络请求. 也就是说, apache也可以实现 "一拖二""一拖三"的功能, 实际上, 也就是apache多弄几个线程而已的事, 每个线程的处理功能都差不多,(粗略的认为...) 一个线程负责处理一个站点的事情.

wamp等apache的目录结构:
/wamp/(www , tmp, bin, logs, lang, alias,和一些启动命令文件), 其中bin是wamp的核心, apache和php和mysql的功能和配置都包含在bin中. /bin/(php, mysql, apche相当于三个分类)/, /apache/Apache2.2.17/(bin, httpd.conf这个是主配置文件, extra/是一些额外的,附加的配置文件, 等等).
也就数说, apache的配置文件目录是: /wamp/bin/apache/Apache2.2.17/conf(有一个专门的conf配置目录)/httpd.conf
httpd.conf是主配置文件, 其他附加配置文件包括 httpd-lang.conf, httpd-dav.conf, httpd-default, httpd-vhosts.conf(vhosts是多个虚拟主机用复数s)都是放在conf/extra/中的, 因为附加的配置太多了, 都不可能直接在主配置文件中配置, 所以使用的是包含语句: # Include conf/extra/httpd-vhosts.conf" (主配置的命令都是以Apache2.2.17目录为默认目录 的)

注意区分ServerRoot 和 DocumentRoot这两个Root
ServerRoot是指apache服务引擎的根路径, 当然就是 /wamp/bin/apache/Apache2.2.17
DocumentRoot是指web服务的内容从哪里输出
ServerName: 是指服务器的名字, 主配置是 localhost:80
Listen 80


windows的热键字母命令, 什么时候加alt? (实际上, 菜单也就只有三种: 程序的主菜单, 右键菜单, 下拉菜单), 那就是, 凡是右键菜单中的命令 + 下拉菜单中的命令, 热键直接按字母, 不需要加alt, 只有对于 "主菜单"中的 热键命令字母, 才需要加alt.


因此, 在配置 virtual host时,(Most configurations use only name-based virtual hosts so the server doesn't need to worry about IP addresses. This is indicated by the asterisks in the directives below. )

由于通常是基于名字的虚拟主机, 所以,不用管虚拟主机的ip地址. 也就是, 主机的ip地址是什么, 虚拟主机的ip就是什么.
配置有两条:

  1. NameVirtualHost *:80
  2. 虚拟主机的配置, 实际上只需要真正起作用的两句
    ServerName  hello.myvhost.com
    DocumentRoot "d:/hello/my"
    

实际上, 即使在windows中, 像apache php mysql这些程序都提供了命令行 命令: 如:
apche: /wamp/bin/apache/apache2.2.17/apache.exe 有很多选项: options: -h -v(查看version), -V -d, -f(指定额外的配置文件) -C -c(额外的处理指令)等


vim如何向上向后 复制/剪切/粘贴等操作

dnj:向下删除n行
dnk:向上删除n行

也就是说 , vim的操作命令有两种方式, (一种是主谓式, 一种是动宾式), 一是 范围/操作对象在前 + 操作动作, 这是最常见的操作方式, 如: 3yy. 另一种是: 操作动作+ 操作的对象(包括范围, 方向), 如: y3k.... 动宾形式的操作通常要结合 表示方向的hjkl操作一起使用. 如: d3j, d3k. 两种的区别是: 主谓式包括当前行, 而动宾式不包括当前行.

总之, 对较多行数的 内容的 最有效的复制/剪切+ 粘贴的方式, 是: 直接使用命令: m, n co/m z 使用命令才是最直接的操作方式!!!


customizable error documents responses come in three flavors(风味, 韵味; 方式;) : plain text; local redirects; external redirects.
ErrorDocument 500 "the server made a boo boo." make a boo boo(出了小错误)

Apache使用的是 模块化结构, 模块化插件式结构, 他的模块很多, 都放在 /apache2.2.17/modules/ 目录下, 格式是如: mod_spelling.so , 对php的

支持是通过 mod_php5.so模块来支持的, 模块名称: php5_module

apache 的虚拟目录?

  1. 注意区别, 虚拟主机和虚拟目录的区别:
    虚拟目录的servername服务器名称(域名)还是 没有改变, 但是虚拟主机的servername(域名) 甚至ip地址都可能改变.
    相同的是, 两者的目标目录路径, 都不是默认的/wamp/www

  2. 虚拟目录的两种使用场合:

    • 临时需要访问一下没有放在 /wamp/www/ 根目录下的路径目录
    • 需要将某个协助内容跟 "主网站"的内容相隔离.
  3. 虚拟目录的域名本身并没有改变, 因为, 如果不是出于上面的两个原因的话, 可以的话, 你完全可以将这个目录 放在域名的/根路径下.(因为对域名 www.hello.com/这个根的访问, 就限定了访问的目录) , 而要访问 本机上, 这个域名的根/ 之外的目录, 又不改变域名, 就可以使用虚拟目录.

  4. 主配置文件中, 对虚拟目录的支持, 是通过Include语句实现的: Include "c:/wamp/alia/*"

  5. 虚拟目录, 你完全可以在httpd.conf中配置, 也可以像wamp一样, 用 /wamp/alias/ 目录+ /wamp/apps/ 目录来表达.
    alias下的虚拟目录也是相应的??.conf配置文件, 因为这样可以合并到主配置文件中去.

    Alias  /myvdir "d:/myvdir"   ## 别名就是虚拟目录, 格式是: alias  /域名根下的虚拟目录别名名称  "虚拟目录别名的目标地址"
    <Directory "d:/myvidr">
    关于目录的配置有几点:
    Options Indexes MultiViews  # 设置Options, Multiviews, 是指当你在域名后输入一个名称比如foo的时候, 他会判断你这个foo是一个目录, 还是一个foo.html文件,还是一个foo.php文件, apache会自动地进行处理
    
    AllowOverride None  # 设置重载
    Order allow, deny     # 设置access顺序
    Allow from all
    
    </Directory>
    

在windosw中, httpd.conf中的配置不区分大小写?!

Order allow , deny, deny, allow 的意思究竟是什么? 第一, 他不像 路由器的acl会 进行短路处理. 而是全部指令都处理. 第二,真实的意思是, 根据order的顺序, 来决定deny语句和allow语句的 "执行顺序", 也就是deny语句和allow语句在有冲突矛盾的时候, 谁 最后生效, "谁覆盖谁", "谁的设置会超越谁"

比如, 同样有两句, deny from all 和 allow 192.168.1.0/24. 如果是 Order deny,allow 则192.168.1.0可以访问, 如果是 Order allow, deny. 则192.168.1.0网段不能访问. 到底用什么顺序, 完全是看你的控制目的而言了.

关于具体的/详细的 httpd.conf的设置, 参考: http://www.cnblogs.com/zhanghw0354/archive/2012/05/08/2490163.html

  1. Windows中的同名字的 系统环境变量和用户环境变量, 如%path%, 在echo的时候, 会自动 "合并"显示...所以, 不管你在系统path路径中设置还是在当前用户的path中设置都是可行的. 只是 系统环境变量的显示在前, 而且优先级更高... 环境变量的好处是, 你在cmd控制台下, 运行程序的bin/command的时候, "可以省略很多的路径字符串的书写"

  2. windows中, 管理机器上运行的服务的命令是net. win启动/停止/重启等的命令是net, 如同linux下的 systemctl命令一样: net statistics [一台机器可以有服务器和工作站两种角色workstation | server ], net start(查看启动了哪些服务), net start /stop [some_service]. net use/user/view/accout等等.

  3. 但是 要查看当前服务/网络连接/侦听的具体情况, 要使用 netstat 命令 参考: netstat的-h帮助文档和: http://blog.sina.com.cn/s/blog_53d3cfea0100nbdq.html : 默认使用主机名来表示的, 要用ip地址则是用-n, 默认只显示established已经建立好的连接, -a则显示已经连接的, 还显示正在监听的(只有tcp才会监听)的; 要查看连接的进程号, 使用-o选项. 即: netstat -ano

  4. 如果通过cmd的 httpd -k start/restart/stop等来控制apache的话, 可能会报" no installed service named apache2- 系统找不到指定的文件". 这时候, 进入apache2.2.17/bin目录, 执行一次 httpd -k install 这样就安装了apache2 服务.. 就可以用httpd -k来控制起停了 .

  5. 右下角的wamp图标的apche服务启停, 并不是服务httpd本身. 而是 执行的 wampapache服务. 要使用 net start/stop wampapache 命令来控制.

  6. httpd的命令选项: -S是检查虚拟主机的配置错误; -M是检查模块的配置错误; -t是检查配置文件的语法错误.

  7. apache的错误日志, 在 /apache2.2.17/logs/error.log中只是最近一次的log, 在/wamp/logs/apache_error.log则是所有以来的日志记录.

  8. httpd.conf中 的配置指令区分大小写吗? 确实, 在windows下, 是不区分大小写的, 比如Listen 80 可以写成 listen , 但是这些其实都是没有什么意义的. 因为你的配置来说, 你依样画葫芦就行了. 不过通常还是照 "惯例", 按 驼峰法去写. 如 AllowOverride None.

  9. 为什么要对每个目录明确的赋予访问权限: 一是, 如果你发现"have no permission to access / on this server" , 通常"对于一个目录来说, 都是644的权限, 都是有访问权限的", 更多的可能是由于 apache服务器配置上的问题, 二是: 由于 在 <Directory /> Order deny, allow Deny from all 中, 就明确说了, 先就为了安全, 把一切访问都禁了. 所以, 以后对于任何网站下的目录, 你都要自己显式的进行权限的设置赋予了.

关于apache的module?

  1. 加载模块的命令是: LoadModule php5_module "c:/wamp/bin/php/php5.3.5/php5apache2_2.dll" 或者: LoadModule vhost_alias_module modules/mod_vhost_alias.so 即: LoadModule 模块的名称 模块的地址

  2. 注意php5的模块, 并没有放在 apache2.2.17/modules目录下, 而是单独的放在 了/wamp/bin/php/php5.3.5/php5apache2_2.dll 其他模块都是放在apache的module目录中的.

  3. so和dll的区别 参考:http://blog.csdn.net/lhj190506206/article/details/46627227
    一个c文件/cpp文件, 经过编译后得到一个*.o文件(目标文件), 里面包含的是 这个编译单元的符号表symbolic tables 所谓id符号就是: o文件中包含的类(对象类), 函数, 枚举, 结构体等. 可以为其他代码所引用
    如果将多个.o文件ar(归档)起来, 就得到 .a文件(所以, .a文件就是归档,就是静态库). 多个.a经过链接器 链接ln后就得到 可执行程序;
    但是, 如果很多地方都要使用这个/这些.o文件 , 用copy/.a方式都不太好. 于是就使用 shared objects, 即: so : 共享对象. 就相当于windows中的dll.
    .a是通过ar命令来生成的; 而 so是用gcc命令加编译选项得到的;
    .a是在可执行程序"编译"的阶段嵌入到程序中的. 静态库跟程序融为一个整体的.
    而so是在 程序运行的时候, 才被 load... 到内存中使用的.
    好处是: 节约内存. 当多个地方都要使用(依赖于)这个so的时候, 在机器的内存中就只有这个对象的一份拷贝.
    ld: loader(dynamic linker 的载入器): 即: 可以自动载入 放在 /lib, /usr/lib下的so和.a
    ldd: loader dependencies: 查看载入器的依赖情况: ldd /bin/foo => /bin/foo /usr/lib/libfoo1.so.1.2 ....
    so和a的命名格式: libxxx.a, libxxxx.so.major.minor.revision: 例如: libfoo.so.1.0.1
    配置ld.so.conf: 包含ld.so.conf.d/*.conf只是这个目录下的*.conf文件, 并不是所有的文件: 比如: 在 ld.so.conf.d/下创建foo.conf ld的配置文件, 然后在foo.conf中描述libfoo.so.1.0.1的路径: /usr/local/lib


  4. "在同一个窗口中打开每个文件夹 & 在不同的窗口中打开不同的文件夹", 是指当你要打开一个新的文件夹时, 是新开一个窗口还是就在原来的窗口中显示(实际上在xp的ghost版本中 已经做了注册表修改, 所以不管你怎么修改这里 的"文件夹选项", 都是一样的结果: 使得总是在同一个窗口中打开每个文件夹. 在hkey_classes_root/下的directory/shell, drive/shell , folder/shell中的"默认"键值的数据都是none.

  5. system32下的快捷方式不能在cmd中执行?
    本来就是这样的. 不要把system32下可以执行的快捷方式, 跟cmd控制台环境path相混淆:

    • cmd控制台, 只认 path中设置的环境变量路径, 而且不能执行快捷方式. 只能是程序本身;
    • 而win+r下是可以直接执行system32下 的程序本身和其指向的快捷方式.
  6. php5apache2.dll he php5apache2_2.dll : 他们的区别是, dll的版本不同, 对应着不同的apache引擎: 可能是apache引擎不同, apache和php.dll的内部代码也有所不同的原因. 即: php5apache? 的版本要和apache的版本相一致!

win注册表中只存在一种内容, 键, 两种内容(就是主键和子键), 而且都是用 "目录"图标来表示的, 右边是她们的设置items. (每个item包括: name, type, data数据). 而且主键和子键都有自己 独立的设置


关于regedit

  1. 是用system.dat和Ntuser.dat文件保存的注册表数据库, 前者是系统信息, 后者是用户配置信息.

  2. 备份为 system.da0和ntuser.da0, 是由系统自动备份的

  3. 注册表的最高节点是"我的电脑". 其中hkey: 表示主键(h key键)和次级主键subkey(也称为主键和子键). 右边是键值value. 一个键值由: value name, value type, value data 组成. 其中hkey_classes_root主要是(里面基本上全部是 扩展名如.doc, .dll的样子). hkey_current_user是关于当前 "登录用户"的设置, 而hkey_users是关于所有 "登录"用户的设置. hkey_local_machine是关于当前机器的硬件和软件的设置,包括 hardware, system, software, sam等的设置. hkey_current_config是关于当前配置.

  4. 键值的类型有三种(以REG_为前缀): REG_SZ字符串, 主要是用来表示文件的描述和硬件的标识,由字母.数字.汉字组成, 最长255个字符: REG_DWORD, 是数值型, 用16进制表示,占4个字节32位, REG_BINARY表示二进制数据, 也是用16进制表示, 字节数没有限制; REG_SZ的图标是ab表示描述的意思; 而REG_DWORD REG_BINARY都是用16进制表示,所以图标都是011 110

  5. 关于clsid: guid是全球唯一标识符, win使用clsid来表示. 其中 的cls:class表示特定对象的类(类型). clsid 共128位, 16个字节, 注册表中由于使用16进制,所以共32位, 表示方法是: {20d04fe0-....-...}. 分5节: 8位-4-4-4-12位. 主要由: 两部分数字来源(一是 机器的mac地址, 二是机器(系统)的当前时间), 当然有一个算法, 和一个生成函数.. 根据算法, 总是能得到固定不变的一些 clsid来表示特定的 "特殊的系统组件/类似文件夹, 并不是真实的文件夹, 如我的电脑, 回收站, 控制面板等" 这个就记住或查阅就好了. 如:我的电脑的前8位clsid就是: 20d04fe0.... 然后你找到它就可以对他进行设置了.


hosts和dns的区别

hosts是将 ip地址和域名 进行映射. host是毕竟不是dns服务器. 所以不像dns那样 将域名 -> ip地址. hosts是网络中识别机器主机的, 直接的识别是通过ip地址的. 所以, hosts是关于ip地址-> 域名映射的.


关于地址: 0.0.0.0 和* 和具体的ip : 参考: http://www.2cto.com/net/201310/253427.html

0.0.0.0其实严格来说 已经不是"一个ip地址"了, 你ping不通它, 会 提示说" Destination specified is invalid". 在路由器/路由/路由表中,代表的是任何网络和任何主机, 是表示路由表中没有明确指定的无法查询的包; 但是 在netstat中, 表示的是 this(即当前主机的ip地址). 因为, 一个主机即使只有一个网卡 也可以有多个ip, 而且至少有两个ip地址, 即你设置的地址如192.168.1.1, 还总是存在一个127.0.0.1 这个地址. 在有些应用中, 为了保证无论你是输入 192.168.1.1 还是你输入127.0.0.1 都能正确的进行网络侦听和连接应用. 这时你的ip就要设置成0.0.0.0 , 否则你设置成其中的任何一个, 那么另一个ip地址就不能侦听. String ip='0.0.0.0' 即, 0.0.0.0就相当于this. 代表的是本机的所有ip地址.
java的面向对象的代码: (本机上, java进行 外部主机的 外来网络连接 request 侦听的, 是通过ServerSocket这个对象来实现的, 实际上, 这个Socket也是java提供的已经封装了的对象): 很简单, 将本机local地址和端口绑定到socket上, 然后让socket.accept就好了.

ServerSocket socket = new ServerSocket(8080);  // 这里可以初始化一个 本机端口如8080
socket.accept();
// 这个时候, socket绑定的 inetsocketAddr就是 默认的0.0.0.0: 8080, 所以你用127.0.0.1:8080 和192.168.1.1:8080 都可以实现侦听

-----------------------------------------------------------------------------

但是, 如果显式的指定ip地址, 不是0.0.0.0的话, 就只能使用一个:
ServerSocket socket = new ServerSocket();
String ip='0.0.0.0';
int port=8080;
InetSocketAddress  addr=new InetSocketAddress(ip, port);
socket.bind(addr);
socket.accept();

local address和 foreign address: 是内部地址(本机地址)和外部地址. (因为对于自己的机器来说, 他本身就有两种角色(从软件上分), 一种是workstation, 一种是server), 所以是可以自己连接到自己的. 像system/svhosts等 很多进程 就是自己连接到自己. 的

星号表示任意的, :表示任意ip地址的机器上的任意端口....


关于vhost设置的几个特别注意的问题

  1. 如果设置了vhosts,那么原来的 /wamp/www/ 就变得无效了. 也就说, 要用vhosts, 则所有的站点都要使用 虚拟主机进行配置, 否则就无效!
  2. 设置了虚拟主机后, 如果出现have no permission to access '..'. , 是由于你没有显式的 设置 虚拟主机 所对应的 目录的访问权限.
  3. 而且在设置虚拟主机vhosts对应的 目录的权限时, 设置的directory的位置应该放在 vhost标签的内部, 而不是单独的外部 .
  4. 虚拟主机的设置, 必须要设置的两项是: ServerName 和 DocumentRoot这两个, 其他可以省略
  5. 关于虚拟主机的地址指定就要了解*, 127.0.0.1 和机器的ip地址之间的差别, 见后面.
  6. 虚拟主机的servername也必须 要在hosts中做域名解析的设置, 否则机器在hosts中查找不到域名对应的ip地址后, 也无法做虚拟主机的解析, 而且hoosts文件中的域名对应必须是本机的ip地址,不能是127.0.0.1, 如: 192.168.1.100 www.foo.com
  7. 在httpd-vhosts.conf中, 虚拟主机的地址可以是本机ip地址, 也可以是星号(表示本机上所有可用的ip地址, 但不包括127.0.0.1), 但是不能是127.0.0.1

总之, 一个虚拟主机的设置就是如下所示:

NameVirtualHost *:80 (或者是 192.168.1.100:80, 两者都可以)
<Virtualhost *:80>  (这里对应的是:  192.168.1.100:80)
   ServerName  www.myvhost.com
   DocumentRoot  "d:\myvhost" 
   <Directory "D:\myvhost"> // 这个要放在 VirtualHost标签内部
       Options Indexes MultiViews FollowSymLinks
       AllowOverride None
       Order allow, deny
       Allow from all
   </Directory>
</VirtualHost>

[附录]: "*", 127.0.0.1 和ip地址的区别

  1. 127.0.0.1是机器的回环地址, 整个127网段都可以, 使用127.0.0.1只是习惯约定. 它是测试协议栈是否建立的地址. 这个地址的数据包不会出网卡. 遇到127.1时会立即返回. 主要的目的是: 用作本机网络应用的地址(因为 同一个 机器(网卡)既可以做服务器, 也可以做工作站. 完全是由机器上跑的程序软件 决定的. 如果跑服务器端软件, 那么他就是服务器...在同一个机器上的某些软件,就是以自己=>到自己的应用, 因此, 此时就是以127.0.0.1为服务器-客户端地址的.也就是说, 如果是本机本地服务-客户端软件的, 最好使用127.0.1地址
  2. 而本机ip地址, 是要将数据包发往网卡 外部的, 是要出网卡的. 要通过路由器, dns, 交换机等. 如果没有路由器, dns, 交换等是无法使用本机ip地址进行网络应用的.即要使用外部网络应用会一些特殊应用, 如虚拟主机的应用
  3. 总之, 127.1和本机ip地址肯定是有区别的, 有些地方只能使用127地址, 有些地方只能使用ip地址.有些地方 使用两者的效果是不一样的.比如: 在hosts将域名www.foo.com映射为127.0.0.1, 那么在虚拟主机中无论你怎么配置, www.foo.com都将会加载 localhost对应的网站. 或者在虚拟主机中,如果将虚拟主机的地址设置为127.0.0.1, 那么同样的无论你怎么设置, 都不会对应到虚拟主机, 而是对应到localhost. 也就是说, 要想使虚拟主机有效, 在hosts和httpd-vhosts.conf中, 都不能使用127.0.0.1, 或者说在hosts和httpd-vhosts.conf中, 都只能将地址设置/映射为本机ip地址, 类似192.168.1.100之类的地址.

windows cmd命令杂项:

  1. windows cmd的shell命令基本上 跟linux 是一样的 . 类似的...所以, 在windows中, 凡是能够用cmd处理的 尽量用cmd来处理.比如:
    echo hello world > index.html ; type foo.text; (注意打印/显示到屏幕是type命令, 如果cat命令, 但是print是真的调用打印机进行打印); 一样的有 pushd popd等等.
  2. set命令是显示所有的环境变量, set path是显示某一个具体的环境变量. 要注意: 只有当set varName=...后才是设置变量的值. 也就是说, 只有变量名后跟上 等于号 后才是进行设置. 设置的时候, =空格,表示设置为空; 直接等于表示覆盖, 要追加内容, 使用 : set path=%path%;c:\;c:\test类似的
  3. 最重要的是, 使用cmd进行设置环境变量的时候, 是临时的. 他没有永久的生效的方法, 要永久设置生效环境变量,使用 注册表或 电脑属性高级-..
  4. 同一个命令可以有两个命令单词, 效果是一样的: 如: ren = rename; md = mkdir; 而且win还提供了删除文件夹的命令.rmdir= rd
    注意,这个rm 是 remove的缩写(rm = remove)
  5. vim关于结尾有两个, 不要搞混淆了: \(是一行内容 的结尾, 而G才是整个文件的结尾, 所 d\), 是删除到本行结尾; 而dG才是删除到文件结尾.

posted @ 2017-07-16 16:34  noitanym  阅读(7371)  评论(0编辑  收藏  举报