1

我有一个像这样的文件夹结构

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>

在视图/.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 不能与两个 url 一起正常工作。

我是否需要更改文件夹结构以更正它,或者我是否需要更改任何 htaccess 文件以访问check.php?

4

2 回答 2

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:请记住,这不是防弹的(并且可以被欺骗),因为:

  1. 如果有人访问 View/index.php 那么他可以自由访问 check.php。如果会话在 ajax 请求之后被终止,则可以缓解这种情况。如果 ajax 请求包含 2 个请求,您可以实现这一点,例如,一个获取在 10 秒内过期的会话密钥,然后使用该密钥从 check.php 获取结果

  2. 会话也可以被欺骗(在这里阅读更多)

于 2012-07-29T15:47:13.080 回答
1

为什么不在“查看”文件夹中设置域的路径,所以没有人可以访问您的控制器等?

我认为这也应该比玩弄 .htaccess 更简单!

这是大多数 PHP 框架的做法。

如果您需要访问 check.php 的功能,您可以创建一个“ajax.php”来检查请求是否正常,然后使用“check.php”来捕获结果!

于 2012-07-29T16:46:33.267 回答