除了现有文件和文件夹之外,Apache将all重定向到index.php

时间:2015-12-08 06:32:51

标签: php apache .htaccess

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

  • CSS / theme.css
  • 资产/ assets.js
  • 资源/ locale.js

当我尝试这个配置时:

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

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

5 个答案:

答案 0 :(得分:10)

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

++x;
--y;
z = x - (y*b)/a;

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

基本上,如果请求导致错误404,则将使用回退资源uri来处理请求,正确填充FallbackResource /index.php 变量。

答案 1 :(得分:2)

你的规则没问题。 css / js / image的问题在于你使用相对路径来包含它们。

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

<base href="/" />

以便从该基本网址解析每个相对网址,而不是从当前网页的网址解析。

还要在.htaccess中保留此规则:

DirectoryIndex index.php
RewriteEngine On

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

答案 2 :(得分:1)

根据the documentation REQUEST_FILENAME,如果服务器已经确定了路径,则仅评估文件的完整本地文件系统路径。

简而言之,这意味着如果条件位于.htaccess文件内或httpd.conf中的<Directory>部分内,则该条件将起作用,但如果它位于{{<VirtualHost>内部则不行1}}。在后一种情况下,您只需将其包装在<Directory>标记中即可使其正常工作。

<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>

答案 3 :(得分:0)

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

ErrorDocument 404 /index.php

答案 4 :(得分:0)

现在只有这对我有帮助:

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