【问题标题】:Rewrite htacces can't find files重写htaccess找不到文件
【发布时间】:2016-12-08 21:23:11
【问题描述】:

我创建了一个 ajax 网站,该网站从我的 index.php 内的 /pages 文件夹调用 php 页面,因此我在 htaccess 中进行了重写,以便在我的索引中返回我的所有页面,因此 ajax 运行良好,但是当单击刷新页面时按钮或首次加载时,函数找不到文件,一直返回404.php页面:

这是我的 htaccess:

Options +FollowSymLinks

RewriteEngine On

RewriteBase /
RewriteRule ^([a-zA-Z0-9\-]*).php$ index.php?p=$1 [L]

这是我的 php 函数调用我的页面:

<div id="ajax-container">
<?php
 $d = "pages/";
 if (isset($_GET['p'])) {
    $p = strtolower($_GET['p']);
    if (preg_match("/^[a-z0-9\-]+$/", $p) && file_exists($d . $p . ".php")) {
        include $d . $p . ".php";
    } else {
        include $d . "404.php";
    }
 } else {
    include $d . "home.php";
 }
?>
</div>

我认为问题来自我的重写,因为它重写了所有页面 php,所以我认为它也在重写我的 index.php,所以该函数找不到 ['p'],但我不确定,我不知道知道是不是这样,我怎样才能只重写我的/pages 文件夹中的文件

【问题讨论】:

  • 您可能希望在 file_exists() 函数中使用服务器文件路径,尝试定义 $d = realpath( __DIR__ . '/pages/' ); - 您可能还想添加一些健全性检查,例如 is_dir()
  • 问题仍然存在,实际上我不明白为什么该函数找不到我的页面,因为它找到了文件夹,它返回了 404.php 页面,为什么它找不到其他页面
  • 哦是的 - 这正是正在发生的事情,你需要标准的 not file not directory 条件

标签: javascript php jquery ajax .htaccess


【解决方案1】:

index.php 在第二遍被您的 Rewrite 拾取并被发送到 index.php?p=index,在您的 pages 目录中没有相应的页面,因此获取 404.php

避免这种情况的正常方法是将 not filenot directory 的条件添加到您的 .htaccess 中(从而防止 URL 指向文件或实际存在的目录被重写)。

您只需将 .htaccess 更改为:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9\-]+)\.php$ index.php?p=$1 [L]


请参阅 Apache 的 RewriteCond 手册。

【讨论】:

  • 是的,谢谢它正在工作,但现在我有另一个问题,它在第一次加载时运行良好(返回 home.php)但是当我点击我的一个 ajax 链接页面时(例如 about. php ) 并且我刷新页面,它只返回 about.php,但不要在我的 index.php 中返回它
  • 你有 2 个about.php 页面吗?一个在根目录,一个在/pages ?
  • oups :x...是的...当我试图找到解决方案时我忘记了,我会鞭打自己对不起:)谢谢你的帮助;)
  • 不用担心 :) 避免该问题的一种方法是在/pages 目录中为您的文件使用扩展名.phtml;它们是你的 Views 并且是 HTML 和 PHP 的混合体,所以使用 .phtml 是有意义的……你实际上正在慢慢地朝着 MVC 设计模式努力;)
猜你喜欢
  • 1970-01-01
  • 2012-12-12
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多