【问题标题】:htaccess rewriterulehtaccess 重写
【发布时间】:2010-12-26 08:23:52
【问题描述】:

一个相当基本的 htaccess 问题,但我用的不多,所以我不知道。 我想检查请求的文件是否存在。如果是,则转发到一个页面,如果不是,则转发到另一个页面并将请求的路径作为 GET 传递。

提前致谢。

【问题讨论】:

    标签: .htaccess mod-rewrite


    【解决方案1】:
    RewriteEngine On
    
    # check if requested file or directory exists
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    
    # if not, pass it to index.php
    RewriteRule ^(.*) index.php?page=$1 [QSA]
    

    正如 Gumbo 建议的那样,如果您还想在文件存在时重写 URL,则可以重复不带 ! 的条件。也许您想用这种方法“保护”您的真实文件和文件夹。

    【讨论】:

    • 谢谢,请问 [QSA] 是做什么的?
    • [QSA] 保留查询字符串。
    • 有什么方法可以传递完整路径而不仅仅是文件名?
    • 尝试在 RewriteRule 中使用 {REQUEST_URI}。它将被路径替换。
    【解决方案2】:

    RewriteCond condition 中使用-f 表达式来测试给定路径是否指向现有的常规文件:

    RewriteEngin on
    
    # file exists    
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ one-page [L]
    
    # file does not exist
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ another-page [L]
    

    然后,初始请求的 URI 应该在环境变量中可用。

    【讨论】:

    • 在将文件转发到页面之前,如何检查以确保文件名不是 index.php?
    • @Dylan:你可以像RewriteRule !^index\.php$一样把它放到你的规则中。或者你附加一个附加条件:RewriteCond %{REQUEST_URI} !^/index\.php$.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 2011-08-30
    • 2011-03-19
    • 2011-07-23
    相关资源
    最近更新 更多