我有一个类似的文件夹结构
Controller
|_check.php
View
|_ .htaccess
|_ index.php
|_ Webroot
|_ js
|_common.js
.htaccess
In.htaccess
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ View/ [L]
RewriteRule (.*) View/$1 [L]
</IfModule>
视图/.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
(视图文件)中有一个按钮,带有到check.php
的ajax。
我给出了common.js对应的ajax函数url作为
var url = 'check.php'; // OR '../Controller/check.php'
问题是ajax在使用两个url时不能正常工作。
我是需要更改文件夹结构来更正它,还是需要更改任何htaccess文件来访问check.php
?
这与文件夹结构无关,而是错误的htaccess重写规则。
您在"根"中的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请求由两个请求组成,例如,一个请求获取10秒后到期的会话密钥,然后使用该密钥从check.php获取结果。
会话也可能被欺骗(点击此处阅读更多)
为什么不在"View"文件夹上设置域的路径,这样就没有人可以访问您的控制器等?
我认为这也应该比玩.htaccess更简单!
这是大多数PHP框架的工作方式。
如果你需要访问check.php的函数,你可以制作一个"ajax.php"来检查请求是否正常,然后使用"check.php"获取结果!