.htaccess RewriteCond的范围

时间:2015-05-15 14:16:43

标签: apache .htaccess

我在我的服务器中创建了一个.htaccess文件以满足我的需求:

<?php

ob_start();

    // Define $username and $password 
    $username=$_POST['username']; 
    $password=$_POST['password']; 

    $username = stripslashes($username);
    $password = stripslashes($password);
    $username = pg_escape_string($username);
    $password = pg_escape_string($password);

if($username == "username" && $password == "password"){
        $_SESSION['username']="username";
        $_SESSION['password']="password";
        header("location:main.php");
}
else header("location:index.php");
ob_end_flush();
?>

我添加了:

<IfModule mod_rewrite.c>
   #Enable the Rewrite Engine
   RewriteEngine On

   #Rewrite the base to / if this is not local host
   RewriteBase /

   #Set the base in case of local development
   RewriteCond %{HTTP_HOST} ^(.*)localhost(.*)$
   RewriteBase /~asafnevo/api

   #Redirect every request to the index.php
   RewriteRule ^(.*)$ api/index.php?request=$1 [QSA,NC]

   # Prevent direct access to access to the index.php
   RewriteCond %{THE_REQUEST} index\.php
   RewriteRule ^(.*)index\.php$ - [F]


</IfModule>

为了在我的localhost开发环境中拥有不同的基础,但我的问题是RewriteCond什么时候结束?

我试着做

   #Set the base in case of local development
   RewriteCond %{HTTP_HOST} ^(.*)localhost(.*)$
   RewriteBase /~asafnevo/api

但我收到500错误。

有人可以在RewriteCond事宜上花费范围吗?

2 个答案:

答案 0 :(得分:4)

仅针对遇到的下一个RewriteCond指令评估RewriteRule。 Mod_rewrite将首先评估RewriteRule的第一个参数,然后它将评估它在上一次遇到RewriteCond后遇到的所有RewriteRule,如果所有评估为true,它将执行请求的重写。

考虑以下示例:

RewriteCond . . #1
RewriteCond . . #2
RewriteRule . . #3

RewriteCond . . #4
RewriteRule . . #5

如果#3的第一个参数匹配,它将评估条件#1和#2,然后重写为#3的第二个参数。如果#5的第一个参数匹配,它将评估#4,然后重写为#5的第二个参数。

答案 1 :(得分:1)

您错误地使用了RewriteBase。您无法使用[L]标记,因为它不是 RewriteRule ,因此您会收到500错误。此外,您的规则中只能包含 1 RewriteBase。如果文件有多个Bases,它将使用最后一个。因此,如果您真的尝试在多个RewriteBase的生产中使用它,它将开始引发问题。

  

RewriteBase指令指定要用于的URL前缀   per-directory(htaccess)替换a的RewriteRule指令   相对路径。

http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase

RewriteCond仅用于规则。

http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond

如果你在本地盒子上或者保留2份副本,你只需编辑.htaccess,只需在本地需要时重命名即可。