Apache RewriteCond %{REQUEST_FILENAME} 不起作用问题

最近在项目中使用 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不会自动加上项目目录路径。

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

(完)

时间: 2024-08-04 12:54:36

Apache RewriteCond %{REQUEST_FILENAME} 不起作用问题的相关文章

伪静态- .htaccess中设置 RewriteCond %{HTTP_HOST} 不起作用

问题描述 .htaccess中设置 RewriteCond %{HTTP_HOST} 不起作用 ```RewriteEngine on RewriteCond %{HTTP_HOST} ^aaa$ [NC] RewriteRule ^([a-zA-Z]+/)+list-([0-9]+)-([0-9]+).html index.php?m=content&c=index&a=lists&catid=$2&page=$3 RewriteRule ^([a-zA-Z]+/)+sh

java-POI Apache中 POIFSFileSystem 有什么作用么?

问题描述 POI Apache中 POIFSFileSystem 有什么作用么? 在看POI Apache的API的时候发现HSSFWorkbook的构造函数有: HSSFWorkbook(java.io.InputStream s); HSSFWorkbook(POIFSFileSystem fs); 然而POIFSFileSystem的构造函数有: POIFSFileSystem(java.io.InputStream s); 小弟初学这个,哪位前辈可以告诉我Workbook的这两种构造函数

apache spring @RequiresRoles 不起作用

apache spring @RequiresRoles 不起作用,只需要把下面代码添加到spring-mvc 配置文件中 <!-- Support Shiro Annotation --> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings">

apache中.htaccess不起作用

找到apache的配置文件httpd.conf文件,找到:  代码如下 复制代码 #LoadModule rewrite_module modules/mod_rewrite.so 去掉前面的#号. LoadModule rewrite_module modules/mod_rewrite.so 然后在AccessFileName htaccess  (windows里面这样设置) 如果还是不行我们可以对要设置的站点进行  代码如下 复制代码 <VirtualHost *:80>       

Apache中RewriteCond规则参数的详细介绍

Apache中 RewriteCond语句对于我来说一直是个难点,多次试图去把它搞明白,都没有结构,这次我终于算大概知道它的意思了   RewriteCond就像我们程序中的if语句一样,表示如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句,这就是RewriteCond最原始.基础的功能,为了方便理解,下面来看看几个例子. 复制代码 代码如下: RewriteEngine on RewriteCond %{HTTP_USER_AGENT} ^Mozilla

浅析Apache中RewriteCond规则参数的详细介绍_php技巧

RewriteCond就像我们程序中的if语句一样,表示如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句,这就是RewriteCond最原始.基础的功能,为了方便理解,下面来看看几个例子. 复制代码 代码如下: RewriteEngine onRewriteCond  %{HTTP_USER_AGENT}  ^Mozilla//5/.0.*RewriteRule  index.php            index.m.phpRewriteCond  %

Apache在httpd.conf配置文件中设置伪静态(Rewrite)

.htaccess文件应该被用在内容提供者需要针对特定目录改变服务器的配置而又没有root权限的情况下.如果服务器管理员不愿意频繁修改配置,则可 以允许用户通过.htaccess文件自己修改配置,尤其是ISP在同一个机器上运行了多个用户站点,而又希望用户可以自己改变配置的情况下. 虽然如此,一般都应该尽可能地避免使用.htaccess文件.任何希望放在.htaccess文件中的配置,都可以放在主配置文件的段中,而且更高效. 避免使用.htaccess文件有两个主要原因. 首先是性能.如果Allo

apache的rewrite伪静态实现自动生成html静态化

所有的链接都使用的是/article_view_6.html 第一次执行,用的是rewrite,然后生成了article_view_6.html这个文件,第二次访问.apache就直接使用article_view_6.html这个静态页面了 下面自己写的一个.htaccess文件,主要的作用就是rewrite静态化,如果html文件存在,则直接用,不使用伪静态(不执行php教程),后台如果对文章.首页或是列表页做了更改,只需把相应的html文件删除就行了,无需重新生成.  代码如下 复制代码 <

Apache服务器中.htaccess文件的实用配置示例集锦_Linux

.htaccess 是什么? htaccess (hypertext access,超文本访问) 是为网站所有者提供用于控制服务器环境变量以及其它参数的选项,从而增强他们网站的功能的文件.这些文件可以在网站目录树的任何一个目录中,并向该目录以及目录中的文件和子目录提供功能. 这些功能是什么呢?其实这些是服务器的指令,例如命令服务器执行特定任务的行,这些命令只对该文件所在目录中的文件和子目录有效.这些文件默认是隐藏的,因为所有操作系统和网站服务器默认配置为忽略它们,但如果查看隐藏文件的话,你就可以