当 laravel 项目位于子目录中时,如何使用 .htaccess 文件将请求重定向到“public/”目录[重复]

问题描述 投票:0回答:1

我的目录结构如下所示:

/
├─ index.html
├─ .htaccess
├── backend/
│   ├── public/
│   │   ├── index.php

我的目标是在根目录中设置 .htaccess 文件,以便任何像

example.com/backend
这样的 URL 都被重定向到
example.com/backend/public
或者换句话说
example.com/backend/index.php
被重定向到
example.com/backend/public/index.php
backend
目录包含一个用作API的Laravel项目,我需要通过像
example.com/backend/anylaravelroute
这样的url访问它。

这是我当前的 .htaccess 文件:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]
    
    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ /backend/public/index.php [L]
</IfModule>

我面临的问题是,虽然此 .htaccess 配置成功将请求重定向到

/backend/public/index.php
,但 PHP 中的
$_SERVER['REQUEST_URI']
仍然包含带有
/backend/
的路径。结果,Laravel 错误地处理路由并返回 404 错误。例如,
example.com/backend/api
返回404错误,而
example.com/api
可以工作但不是我想要的,laravel中的
APP_URL
设置为
example.com/backend
并且我正在使用laravel 10.10。

由于特定的限制,我无法通过将公共目录移到 /backend/ 之外来更改目录结构。此外,我无法控制 Apache 配置,解决此问题将阻止对后端目录中文件的任何直接访问,因为所有请求都将重定向到后端/公共,因此不会导致安全问题。 现在,我需要配置 .htaccess 文件以实现所需的行为。有一种替代解决方案,涉及使用符号链接,但它可能会引入其他问题。因此,最好使用 .htaccess 来解决这个问题。

php laravel apache .htaccess
1个回答
0
投票

添加以下内容:

# Redirect /backend requests to /backend/public
RewriteRule ^backend(/.*)?$ backend/public/$1 [L]
© www.soinside.com 2019 - 2024. All rights reserved.