最近在项目中使用 apache 做页面静态化,需要实现一个需求:

当用户访问 index.html 的时候,让 apache 判断如果index.html 不存在,就转向 index.do 这个路径。

index.do 就是生成静态页面 index.html 的,以后用户再访问 index.html 就会直接使用 index.html 这个静态页面了,从而达到网站静态化的目的。

在配置 apache 让 apache 判断 index.html 文件是否存在的时候出现了问题。

首先需要开启 rewrite 功能,按如下步骤操作:

1、去掉 httpd.conf 文件中 #LoadModule rewrite_module modules/mod_rewrite.so 前面的 # 号,表示开启 rewrite 模块功能。

2、在httpd.conf 中添加如下配置进行测试

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-s

RewriteRule ^/a\.html$  /b.html   [L]

测试结果是:不管 a.html 文件是否存在,都会转到 b.html 。

百思不得其解,然后各种百度Google,也没有找到答案。

思考到深夜,也没有想出为什么。第二天继续开始慢慢分析原因…………

首先可以确定的是:之所以每次都会跳转到 b.html 原因肯定是 apache 就是认为 a.html 不存在。我的 a.html 就是静静的躺在那里,为什么 apache 就是认为她不存在呢?

我们访问文件的时候输入的URL 规则都是 http://www.test.com/a.html、http://www.test.com/user/detail.html ………等等。

于是猜想:使用 %{REQUEST_FILENAME} 得到的会不会是只是 /a.html、/user/detail.html 这样的路径,apache 不会去追加我们项目的目录路径后再判断是否存在?

然后我就把我上面测试的 a.html 文件放到 linux 的根目录 / 下面,然后进行测试。

结果是令人开心的,这个时候显示了 a.html 的内容,并没有跳转到 b.html。

所以确定了一个结论:

使用 RewriteCond %{REQUEST_FILENAME} !-f 来验证一个文件是否真正存在的时候,验证的是一个实际的物理文件的实际物理路径,不会自动以当前项目的目录为Base目录。RewriteCond 的 input 文件应该是一个绝对路径的。

我的项目Base 目录为:/svcroot/runtime/webstatic/shanhyweb ,我的 a.html 和 b.html 都放在这个目录下。

那么我们在判断文件是否存在的时候,应该这样写:

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f

这样处理,就解决问题了。哈哈~~

之所以网上很少能找到解决问题的资料,可能是因为大家用的一般都是 .htaccess 文件的配置方法,或者一般将项目的目录放在系统的根路径下面。所以才不会出现问题。

如果我们使用 .htaccess 文件配置,则不需要使用 %{DOCUMENT_ROOT} ,因为 .htaccess 是目录级别的,apache 会自动加上项目路径。

而在http.conf文件里面的进行配置,apache不会自动加上项目目录路径。

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

(完)

Apache RewriteCond %{REQUEST_FILENAME} 不起作用问题相关推荐

  1. apache RewriteCond详解

    RewriteCond就像我们程序中的if语句一样,表示如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句,这就是RewriteCond最原始.基础的功能,为了方 ...

  2. Apache RewriteCond RewriteRule 跳转故障解决

    需求: 文件存在直接访问文件,文件不存在跳转到index.html. URL 以 /abc 开头的不跳转. 错误规则 RewriteCond %{REQUEST_FILENAME} !-fRewrit ...

  3. .htaccess 基础教程(四)Apache RewriteCond 规则参数

    Apache模块 mod_rewrite 提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求.它支持每个完整规则可以拥有不限数量的子规则以及附加条件规则的灵活而且强大的URL操作机制.此UR ...

  4. php rewrite 规则,Apache RewriteCond ReWrite规则

    Apache通过RewriteCond设置ReWrite规则,可以在httpd.conf配置文件中直接设置rewrite规则,也可以根据需要在网站的.htaccess文件中设置rewrite规则. R ...

  5. 为何Apache下.htaccess不起作用,Linux、Windows详解

    可能出现下面这三种的错误可能性: 第一种:启用 rewrite 和 .htaccess 设置 rewrite设置:找到apache的配置文件httpd.conf文件,找到:#LoadModule re ...

  6. Apache中RewriteRule和RewriteCond规则参数的详细介绍

    RewriteCond就像我们程序中的if语句一样,表示如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句,这就是RewriteCond最原始.基础的功能,为了方 ...

  7. 浅析Apache中RewriteRule和RewriteCond规则参数的详细介绍

    参考:  http://www.jb51.net/article/39298.htm http://www.cnblogs.com/scgw/archive/2011/05/01/2033730.ht ...

  8. Apache伪静态(Rewrite).htaccess文件详解以及RewriteCond 规则

    Htaccess(超文本访问)是一个简单的配置文件,它允许设计师,开发者和程序员通过它来改变Apache Web服务器的配置. 这些功能包括用户重定向.URL重写(url rewrite,国内很多称为 ...

  9. Apache 301重定向中RewriteCond规则参数介绍(转)

    CodeIgniter2.0已经出来有20多天了呢~也就是我一直用的php框架(CI).一直都在研究jquery, 倒是把CI给忘到一边去了,呵呵~~今天公司事情不是很多,于是开始熟悉一下CI2.0的 ...

最新文章

  1. Linux服务器上配置anaconda环境
  2. 如何学好算法与程序设计
  3. 解决四个字节的字符无法存入数据库
  4. 万字长文带你了解ETL和数据建模~!
  5. matlab 隐函数求偏导数,[对常数的隐函数的求导]隐函数求偏导数如图,为什么F对x求偏导能把z看成常数z不是对x的导数吗~...
  6. 物联网终端安全系列(之四) -- 终端安全方案之SIM卡篇
  7. html打印宽度怎么设置,A4纸网页打印 html网页页面的宽度设置成多少
  8. c语言char str什意思,char *str与*str的区别
  9. linux 无盘 重新生成内核,Linux无盘系统_尐惢
  10. 动态二维码签到系统~第一节(Python动态二维码生成)
  11. 联想乐Pad:平板电脑中的“SUV跨界创新”
  12. 手机号,身份证号,姓名等校验
  13. [Unity ECS] 游戏对象转换和子场景 [1]
  14. 代码详解设计模式--观察者模式
  15. Lucene入门教程及java实现
  16. Router Password Kracker(路由器密码破解工具)
  17. SAP UI5 应用开发教程之一百零二 - SAP UI5 应用的打印(Print)功能实现详解试读版
  18. 什么是百度快照?百度快照分析及SEO优化基础工作
  19. 数字签名与签名验证过程
  20. html5按钮篮筐怎么去,高手中锋的问题

热门文章

  1. 在线BMI身体质量指数计算器
  2. consul集群搭建,配合nginx完成服务动态发现和健康检查
  3. 【数据库中间件】分布式组件 - ClusterDB-Client
  4. 将home多余的空间分配到/分区下
  5. JetBrains发布Toolbox 采用新的订阅模式
  6. 基本STRUTS标签-学习笔记-Bean标签
  7. SAP MM BAPI_PO_CREATE1的用法
  8. 10g手动创建数据库
  9. Redis的AOF的配置
  10. oracle 11i 供应商api,Oracle EBS AP 供应商API