我如何将所有流量重写为index.php,还要重写到后端目录?

时间:2017-12-07 05:10:26

标签: apache mod-rewrite

我有一个.htaccess如下:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REQUEST_URI} !^public
    RewriteRule ^(.*) index.php [L]
</IfModule>

我的目录设置如下:

root directory:
  html:
      index.php
      .htaccess
  server (code):
      site:
          index.php
          test.php

请求进入html / index.php,然后服务器在后端启动。调用$_SERVER['REQUEST_URI'];会为http://localhost/

生成以下内容
Request URL : /index.php

这是正确的,因为我可以在site / index.php上添加。但是,我也希望http://localhost/test并将其更改为/site/test.php。以下是为$_SERVER['REQUEST_URI'];

调用http://localhost/test时会发生的情况
Request URL : /testindex.php

应该发生什么Request URL : /test所以我可以自己添加网站/ test.php。

谢谢!

1 个答案:

答案 0 :(得分:1)

无法在document_root外部访问文件/目录。简单的解决方案是将index.php更新为路由器。然后路由器需要包含相应的文件(如果存在)。否则你需要处理文件不存在的情况,比如响应404错误。

您可能需要更新此.htaccess以将所有请求重定向到index.php:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REQUEST_URI} !^public

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    RewriteRule ^$ index.php [L]
    RewriteRule ^(.*) index.php?route=$1 [QSA,L]

</IfModule>

然后,您可以在index.php中解析路由:

<?php
    if (isset($_GET['route'])) {
        $route = $_GET['route'];
        if (file_exists(__DIR__.'/../site/' . $route)) {
            include __DIR__.'/../site/' . $route;
        }
    }
?>