zoukankan      html  css  js  c++  java
  • apache url rewrite问题

    apache RewriteEngine Your browser sent a request that this server could not understand

    http://www.rainleaves.com/html/1569.html

    在httpd.conf中设置%{REQUEST_FILENAME} !-f无效解决方法

    今天在调试一个think php的框架,我本地的服务器不支持跟目录下.htaccess文件的RewriteRule,于是我就将.htaccess的内容拷贝到httpd.conf中进行配置,但配置后发现提示错误。

    Bad Request
    Your browser sent a request that this server could not understand.


    .htaccess中的配置如下

    <IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
    </IfModule>

    猜测可能是有绝对路径原因到只无效,于是配置改成:

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ /index.php/$1 [QSA,PT,L] #index.php前面加了一斜杠

    加上跟目录斜杠以后,页面能访问,但新的问题又出现了,页面中所有的js、css、图片的地址都被转向到了错误页面上。可我明明在配置中已经说明了,如果文件或者目录存在则不执行RewriteRule。代码如下:

    #此两行代码含义:如果文件存在,就直接访问文件,不进行下面的RewriteRule.
    RewriteCond %{REQUEST_FILENAME} !-d #如果目录存在就直接访问,不进行RewriteRule
    RewriteCond %{REQUEST_FILENAME} !-f #如果文件存在就直接访问,不进行RewriteRule

    也可以写这个:

    RewriteCond %{REQUEST_FILENAME} !-s #如果文件存在并有大小,直接访问。不进行RewriteRule

    当然还可以通过文件的后缀名来过滤

    RewriteCond %{REQUEST_URI} !^.*(.css|.js|.gif|.png|.jpg|.jpeg)$ #这些后缀的文件,不进行RewriteRule

    以上方法中,测试发现,除了最后通过后缀名来过滤来过滤的以外都无效,可通过后缀名来过滤并不是我的初衷,通过查看RewriteLog日志发现(通过在http.conf文件添加RewriteLog logs/rewrite.log来开启RewriteLog日志),同样是因为相对路径问题而导致的错误,于是在配置的时候加上文档的根目录。修改为如下配置:

    RewriteEngine on
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ /index.php/$1

    测试成功!

    总结,编写Rewrite配置的时候,在http.conf文件里面和在.htaccess文件里面是有区别的,需要注意路径问题,使用.htaccess是以.htaccess文件所在的目录为起始目录,而在http.conf中编写配置是,一定要加上文档的根目录,如“/”、“{DOCUMENT_ROOT}”等…

    附录:

    RewriteCond 重写规则执行条件:
    语法: RewriteCond TestString CondPattern

    生效域: server config, virtual host, directory, .htaccess

    特别的上面的 TestString, 可提供反向引用. 引用模式为: %N 其中N为(0 <= N <=9), 引用当前若干RewriteCond条件中最后符合的条件中的分组成分, 也就是括号里的内容.不过用到的不多. 反向应用多在RewriteRule里常用.

    RewriteCond 语法中的 TestStrng 为要被检查的内容, CondPattern 是进行匹配的规则, 它是一个兼容Perl风格的正则表达式和一些其他的特有字符属性. 这里介绍一下.

    第一个: ! (感叹号) 表示否的意思. 比如一个条件: 判断访问此页面的上一页URL是否包含 sex 字符的话可以用这样: RewriteCond %{HTTP_REFERER} !(sex)

    第二个: < 就是小于的意思, TestString < CondPattern.

    第三个: > 就是大于于的意思, TestString < CondPattern.

    第四个: = 相等的意思. <, >, = 三个和通常程序语言使用的 <, >, = 功能类似.

    第五个: -d 是否是一个目录. 判断TestString是否不是一个目录可以这样: !-d

    第六个: -f 是否是一个文件. 判断TestString是否不是一个文件可以这样: !-f

    第七个: -s 是否是一个正常的有大小的文件. 判断TestString是否不是一个正常的有大小的文件可以这样: !-s

    第八个: -l 是否是一个快捷方式文件. 判断TestString是否不是一个快捷方式文件可以这样: !-l

    第九个: -x 是否是一个文件并且又执行权限. 判断TestString是否不是一个文件并且又执行权限可以这样: !-x

    第十个: -F 检查TestString是否是一个合法的文件,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部subrequest完成的, 因此需要小心使用这个功能以降低服务器的性能。

    第十一个: -U 检查TestString是否是一个合法的URL,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部subrequest完成的, 因此需要小心使用这个功能以降低服务器的性能.

    转载请注明本文链接:http://www.rainleaves.com/html/1569.html

    ThinkPHP隐藏index.php出现No input file specified的解决方法

    因为在Fastcgi模式下,php不支持rewrite的目标网址的PATH_INFO的解析
    ThinkPHP运行在URL_MODEL=2时,会出现 No input file specified.的情况,
    这时可以修改网站目录的.htaccess文件:
     
    RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 
    改为 RewriteRule ^(.*)$ index.php?s=$1 [QSA,PT,L] 
     
    完整的.htaccess代码为:
    1. 复制代码
      <IfModule mod_rewrite.c>
        Options +FollowSymlinks
        RewriteEngine On
      
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        #RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
        RewriteRule ^(.*)$ index.php?s=$1 [QSA,PT,L]
      </IfModule>
      复制代码
  • 相关阅读:
    Hive中频繁报警的问题
    Hadoop中Namenode的HA查询和切换
    昨天面试遇到的一道C语言题
    【转】MapReduce的优化
    关于linux修改max user processes limits的问题
    Hadoop-2.6.0安装文档
    C#使用RabbitMQ
    windows配置Erlang环境
    【转】linux查看及修改文件权限以及相关
    (转)C#图解—PictureBox.SizeMode 属性
  • 原文地址:https://www.cnblogs.com/andydao/p/9242356.html
Copyright © 2011-2022 走看看