【问题标题】:Apache redirect all to index.php except for existing files and foldersApache 将所有内容重定向到 index.php,现有文件和文件夹除外
【发布时间】:2016-03-12 23:51:45
【问题描述】:

我有 index.php 通过$_SERVER[‘REQUEST_URI’] 变量读取完整路径。我的任务是当用户输入时:www.domain/resource/777 重定向到 index.php,路径为 /resource/777 并解析 $_SERVER[‘REQUEST_URI’] 以执行一些逻辑。但我也有真实的文件和文件夹,例如:

  • css/theme.css
  • assets/assets.js
  • resource/locale.js

当我尝试这个配置时:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php [L]

客户端无法获取所有 css 和 etc 文件。如何在 Apache 中编写正确的规则来实现这一点?

【问题讨论】:

  • 嗯,该配置通常对我有用。您能否提供更多信息。是否某些 css 文件有效但其他文件无效?还是所有css文件都不起作用。配置是在 .htaccess 文件中还是在 httpd.conf 中?
  • 我在所有文件上都找不到 404。在 httpd.conf 中配置。真实示例:lib.c.nis.edu.kz/resource/5
  • 感谢您的页面链接。当我向您的一个 .js 文件发送请求时,响应标头显示您的 Web 服务器是 nginx/1.8.0。 RewriteCond 等是 Apache 配置,而不是 nginx。您正在运行哪个网络服务器?
  • Nginx 位于 Apache 之上。 Nginx 只是代理传递给 apache 88 端口。
  • 我不是一个期望,但上面的规则不是说将所有请求文件重定向到index.phpindex.php 不是css 也不是js 文件??

标签: php apache .htaccess


【解决方案1】:

如果您使用的是 Apache 2.2.16 或更高版本,您可以用一个指令完全替换重写规则:

FallbackResource /index.php

https://httpd.apache.org/docs/2.2/mod/mod_dir.html#fallbackresource

基本上,如果请求导致错误 404,则将使用备用资源 uri 来处理请求,并正确填充 $_SERVER[‘REQUEST_URI’] 变量。

【讨论】:

  • 这很好用。我会推荐这个。
【解决方案2】:

你的规则很好。 css/js/image 的问题是您使用相对路径来包含它们。

您可以在页面 HTML 的 <head> 部分下方添加:

<base href="/" />

这样每个相对 URL 都是从该基本 URL 而非当前页面的 URL 解析的。

在您的 .htaccess 中也保留这条规则:

DirectoryIndex index.php
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^[^.]+$ index.php [L]

【讨论】:

  • 没用。问题是我得到了 404。真实示例:lib.c.nis.edu.kz/resource/4
  • 您的 http://lib.c.nis.edu.kz/assets/css/style.css 正在抛出 404。此 css 文件的正确 URL 是什么?
  • 这是主要问题!这些文件是存在的。 RewriteEngine 做了一些用户无法获取这些文件的事情。如果我删除所有 Rewrite* 用户可以获取这些文件。但是 index.php 不会通过 $_SERVER['REQUEST_URI'] 获得“/resource/4”
  • 现在我可以获取文件但 index.php 不起作用:lib.c.nis.edu.kz/resource/5 我收到 404 错误
  • 您使用的是 Server: nginx/1.8.0 而不是 Apache,因此这些 htaccess 规则不起作用。
【解决方案3】:

根据the documentation REQUEST_FILENAME 仅在路径已由服务器确定的情况下评估文件的完整本地文件系统路径。

简而言之,这意味着如果它位于 .htaccess 文件内或 httpd.conf 中的 &lt;Directory&gt; 部分内,则条件将起作用,但如果它仅位于 &lt;VirtualHost&gt; 内,则不会。在后一种情况下,您可以简单地将其包装在 &lt;Directory&gt; 标记中以使其正常工作。

<VirtualHost *:80>
     # ... some other config ...
    <Directory /path/to/your/site>
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^(.*)$ /index.php [L]
    </Directory>
</VirtualHost>

【讨论】:

    【解决方案4】:

    您可以在您的 htaccess 文件中设置错误文档,以便使用 index.php 然后请求不存在的文件:

    ErrorDocument 404 /index.php
    

    【讨论】:

    • 如果可能的话,请您告诉完整的配置吗?
    • @Yoldar-Zi 你的评论应该告诉我什么? :)
    • 我的意思是把它放在 Rewrite* 规则的末尾?
    【解决方案5】:

    目前只有这对我有帮助:

    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^/src/
    RewriteCond %{REQUEST_URI} !^/assets/
    RewriteCond %{REQUEST_URI} !^/resource/
    RewriteCond %{REQUEST_URI} !^/data.json
    RewriteRule ^(.*)$ /index.php [L]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多