我有像
这样的文件夹结构Controller
|_check.php
View
|_ .htaccess
|_ index.php
|_ Webroot
|_ js
|_common.js
.htaccess
在.htaccess
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ View/ [L]
RewriteRule (.*) View/$1 [L]
</IfModule>
在View / .htaccess
中<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
外部.htaccess文件链接到View文件夹,View/.htaccess
链接到index.php。
index.php
(查看文件)中有一个按钮,其中ajax为check.php
。
我给了common.js相应的ajax函数url为
var url = 'check.php'; // OR '../Controller/check.php'
问题是ajax无法正常使用两个网址。
我是否需要更改文件夹结构以更正它,还是需要更改任何htaccess文件才能访问check.php
?
答案 0 :(得分:2)
这不是文件夹结构,而是htaccess重写规则错误。
你的“root”中的htaccess会将所有请求重定向到View文件夹(我假设默认为index.php)
我不明白你想要完成什么,如果你解释我可以帮助你。
在您当前的设置中,除了View / index.php之外,您无法访问任何文件(即使在传递GET参数URL时也是如此)
编辑:
在这种情况下,如果您希望View / index.php是唯一可访问的文件并强制人们通过View / index.php文件,则可以使用PHP会话变量。
像这样......
位于view.php文件的顶部:
session_start();
$_SESSION['viewCheck'] = true;
//rest of view.php code
你的check.php代码中的(或你试图通过AJAX访问的文件)
session_start();
if (isset($_SESSION['viewCheck']) && $_SESSION['viewCheck'] === true) {
//Code of check.php
} else {
//Error message or redirect to view.php, for instance
//error message example
header('HTTP/1.0 401 Unauthorized');
//Redirect example
header("Location: http://www.yourhost.com/View/index.php");
}
注1: 您应该删除htaccess文件的重写规则。
注2: 请记住,这不是防弹(并且可以欺骗),因为:
如果有人访问View / index.php,那么他可以自由访问check.php。如果会话在ajax请求之后被终止,则可以减轻。如果ajax请求包含2个请求,您可以完成此操作,例如,一个请求获取会话密钥,该会话密钥在10秒内到期,然后使用该密钥从check.php获取结果
会话也可以被欺骗(阅读更多here)
答案 1 :(得分:1)
为什么不在“查看”文件夹中设置域的路径,以便没有人可以访问您的控制器等?
我认为这也应该比使用.htaccess更简单!
这是大多数PHP框架的做法..
如果您需要访问check.php的功能,您可以创建一个“ajax.php”来检查请求是否正常,然后使用“check.php”来捕获结果!