zoukankan      html  css  js  c++  java
  • 再谈 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: est类似的
    3. 最重要的是, 使用cmd进行设置环境变量的时候, 是临时的. 他没有永久的生效的方法, 要永久设置生效环境变量,使用 注册表或 电脑属性高级-..
    4. 同一个命令可以有两个命令单词, 效果是一样的: 如: ren = rename; md = mkdir; 而且win还提供了删除文件夹的命令.rmdir= rd
      注意,这个rm 是 remove的缩写(rm = remove)
    5. vim关于结尾有两个, 不要搞混淆了: $是一行内容 的结尾, 而G才是整个文件的结尾, 所 d$, 是删除到本行结尾; 而dG才是删除到文件结尾.

  • 相关阅读:
    Codeforces 1265A Beautiful String
    1039 Course List for Student (25)
    1038 Recover the Smallest Number (30)
    1037 Magic Coupon (25)
    1024 Palindromic Number (25)
    1051 Pop Sequence (25)
    1019 General Palindromic Number (20)
    1031 Hello World for U (20)
    1012 The Best Rank (25)
    1011 World Cup Betting (20)
  • 原文地址:https://www.cnblogs.com/bkylee/p/7190886.html
Copyright © 2011-2022 走看看