首页 > 解决方案 > Apache 在子目录中重写 htaccess

问题描述

让我进入正题。

我有一个具有这种结构的 php 项目

ROOT
.htaccess
--api/
----public/
------index.php
------test.html
--backoffice/

我想要的是使用 api/public 的 index.php 让它像

domain.com/api/index.php 

代替

domain.com/api/public/index.php 

我一直在尝试.htaccess的rewritebase或rewriterules没有成功,我错过了什么?将.htaccess 放在错误的目录中?我必须使用多个.htaccess?

更新:所以我得到了两个 .htaccess 文件,现在我可以使用 url domain.com/api/index.php 进行访问,但它会抛出 401 ,这是……另一方面,我可以访问文件 test.html 位于 /api/public 下,当前 URL 为 domain.com/api/test.html

这是 .htaccess
domain.com/api/ .htaccess 文件

RewriteEngine On
RewriteBase /api/public/
RewriteCond %{REQUEST_URI} !^/api/public/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /api/public/$1

domain.com/api/public/ .htaccess 文件

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]

标签: phpapache.htaccessmod-rewrite

解决方案


我认为您可以使用具有如下规则的单独.htaccess文件in your API folder

RewriteRule ^$ /public [R=301,L]

所以这应该在内部重定向到子文件夹public

ROOT
  | --api/
  |     |-- .htaccess 
  |     |-- public/
  |             |-- index.php
  |-- backoffice/

更新1

我认为在你的情况下这应该有效

RewriteEngine On
RewriteBase /api/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^api/(.*)$ /api/public/$1 [L]

它还取决于您使用的系统和预设。

更新2

我在 XAMPP 上做了一些测试,得到了以下结果

把你.htaccessROOT folderdelete所有其他的.htaccess files in subfolders。重命名api_api或其他,如你所愿

ROOT
  | --.htaccess
  | --/_api/  <<<------- rename
  |     |-- /public/
  |             |-- index.php
  |-- /backoffice/

将此添加.htaccess到根目录

RewriteEngine On
Options FollowSymLinks

RewriteBase /
DirectoryIndex index.php index.html

RewriteRule ^api2/(.*)$ /api/public/$1 [B,L,QSA]

像以前一样打电话yoursite.com/api

这个场景按预期在我的测试系统上运行。试试看。


推荐阅读