我在我的服务器中创建了一个.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事宜上花费范围吗?
答案 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,只需在本地需要时重命名即可。