.htaccess 从站点根目录重定向到公共文件夹,隐藏 URL 中的“公共”?

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

以下是我的网站目录结构:

htdocs/
    My-Project/
        public/
            index.php
            css/
            img/
            js/
        src/
            config.php
            templates/
            library/

我不希望任何用户直接访问

src
目录中的任何文件。
src
包含我的模板和后端逻辑脚本。

我想设置我的

.htaccess
,以便当用户访问我的网站(根文件夹
My-Project
)时,他们会被重定向到
My-Project/public/index.php
。我希望索引页面上的 URL 看起来像
My-Project.com

有什么帮助吗?我对修改我的 .htaccess 文件犹豫不决,因为我在这里和网上看到了很多相互矛盾的建议,以了解执行此操作的最佳方法。

php regex apache .htaccess mod-rewrite
7个回答
72
投票

将此代码放入

/My-Project/.htaccess
:

RewriteEngine On
RewriteBase /My-Project/

RewriteCond %{THE_REQUEST} /public/([^\s?]*) [NC]
RewriteRule ^ %1 [L,NE,R=302]

RewriteRule ^((?!public/).*)$ public/$1 [L,NC]

11
投票

将以下内容添加到 .htaccess 的第一行

DirectoryIndex public/index.php public/index.html

11
投票

这对我一直有效。在公共文件夹之外的根目录中创建一个 .htaccess,然后添加这 3 行并解决问题。

RewriteEngine On
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ public/$1 [L]

10
投票

我对 @anubhava 对在本地主机上工作并使用友好 URL 的响应进行了一些更改。

目录结构:

  • /(本地主机根文件夹)
    • 我的应用程序/
      • 公开/
      • index.php
    • 核心/
      • 一些核心文件...

myapp/.htaccess(myapp根文件夹)

RewriteEngine On
RewriteBase /myapp

RewriteCond %{THE_REQUEST} /public/([^\s?]*) [NC]
RewriteRule ^ %1 [L,NE,R=302]
RewriteRule ^(.*)$ public/index.php?$1 [L,QSA]

myapp/public/.htaccess

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1 [L,QSA]

myapp/public/index.php

<?php
echo 'Hello<br>';
echo $_SERVER['QUERY_STRING'];

一些要求:

http://localhost/myapp/

你好


http://localhost/myapp/post/new

你好

帖子/新


4
投票

我正在为部署在免费网络托管上的“宠物项目”寻找相同的解决方案Infinityfree

目录结构(之前):

htdocs/
   ├─ public/
   └─ src/

上面的答案都没有单独帮助我并导致 404 或 503 http 错误,或者只是向我显示了项目的文件夹。

SandroMarques' 的回答鼓励我尝试添加两个 .htaccess 文件。经过多次尝试,我找到了适合我的解决方案。我使用了 anubhava 的 SandroMarques 的 答案。

目录结构(后):

htdocs/
   ├─ public/
   │   └─.htaccess //second file
   │
   ├─ src/
   └─.htaccess //first file

第一个.htaccess文件:

RewriteEngine On
RewriteBase /

RewriteCond %{THE_REQUEST} /public/([^\s?]*) [NC]
RewriteRule ^ %1 [L,NE,R=302]

RewriteRule ^((?!public/).*)$ public/$1 [L,NC]

第二个.htaccess文件:

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1 [L,QSA]

也许其他人会发现这有帮助。


0
投票

好的,你可以使用 symfony 5 来做到这一点,如果你想放置 .htaccess 来重定向对 public/index.php 文件的访问,你可以这样做:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^$ public/index.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ public/index.php [QSA,L]
如果您有让我们加密的证书,您可以添加此重定向到 https,例如:
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

0
投票

您只需将 .htaccess 文件添加到包含以下代码的公共文件夹中:

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1 [L,QSA]

注意:如果您将此代码放在根文件夹中,它将不起作用

© www.soinside.com 2019 - 2024. All rights reserved.