Php .htaccess从站点根目录重定向到公用文件夹,隐藏;“公众”;在URL中?

Php .htaccess从站点根目录重定向到公用文件夹,隐藏;“公众”;在URL中?,php,regex,apache,.htaccess,mod-rewrite,Php,Regex,Apache,.htaccess,Mod Rewrite,下面是我的站点目录结构: htdocs/ My-Project/ public/ index.php css/ img/ js/ src/ config.php templates/ library/ 我不希望任何用户直接访问src目录中的任何文件src包含我的模板和后端逻辑脚本 我想设置

下面是我的站点目录结构:

htdocs/
    My-Project/
        public/
            index.php
            css/
            img/
            js/
        src/
            config.php
            templates/
            library/
我不希望任何用户直接访问
src
目录中的任何文件
src
包含我的模板和后端逻辑脚本

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


有什么帮助吗?我对修改我的.htaccess文件犹豫不决,因为我在这里和网上看到了很多相互矛盾的建议,关于如何最好地进行修改。

将此代码放入
/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]

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

DirectoryIndex public/index.php public/index.html

我对@anubhava在使用localhost和友好URL时的反应做了一些修改

目录结构:

  • /(本地主机根文件夹)
    • myapp/
      • 公开的/
      • index.php
    • 核心/
      • 一些核心文件
myapp/.htaccess(myapp根文件夹)

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'];

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

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

顺便说一句,为什么首先需要一个公共目录?如果您使用的是共享主机,那么唯一的方法就是通过.htaccess。如果您有一个VPS,那么您可以使用主机设置将服务器指向该公用文件夹。@AndrewBarber:我想这是没有要求的,我只是尽量将前端代码和逻辑代码分开,这种结构有助于我保持组织。不过,我对建议持开放态度,我是大型PHP项目的新手:)好吧,通常认为站点的根目录是“公共”部分。但是,如果您有不希望通过请求访问的代码,它应该完全位于web目录之外,如@checkerdmichael notes@checkerdmichael:yes共享主机。我知道我需要通过
.htaccess
来完成这项工作,但我不确定哪些命令可以完成我需要的两项任务。我是否需要在根目录中使用.htaccess重定向到/public/文件夹,然后在/public/中使用另一个来格式化URL?这部分工作正常,除了返回404的图像外,所有内容都会加载。这是因为我正在使用,它让我在
/public/
目录中创建一个
.htaccess
,它将图像请求重定向到视网膜。有没有办法让这两种方法配合得很好?这是可以做到的,你能从
/My Project/public/.htaccess
.htaccess发布你的.htaccess吗?@pathros:这是一个行之有效的解决方案。您可以发布一个包含所有详细信息的新问题来解决问题。由于可能的配置错误,我得到的
请求超过了10个内部重定向的限制。
对我有效。注意:如果您使用的是XAMPP或类似工具,您的
/htdocs/my project/.htaccess
文件也应该使用
RewriteBase/my project/
@Pathros请确保将其放在重写引擎语句之后似乎只加载
pub/index.php
-不加载相关页面?它可以工作,但如果我在URL中放置public,它也可以工作,而且由于Google已使用public对URL进行了索引。你知道有什么方法可以将带有public的URL重定向到不带public的URL吗?我尝试过这样做:
RewriteRule^public/(.*)$/$1[R=301,L]
,但它不起作用。因为我们将所有内容路由到/public,所以在上面的代码指定URL之前,您必须先指定URL,这样它才能正确找到路由。在公用文件夹中,创建一个新的htaccess,并在RewriteRule ^public/(.+)$[R=301,L]上添加此代码重写引擎,将url替换为您自己的url
RewriteEngine on
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ public/$1 [L]