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

Posted

技术标签:

【中文标题】.htaccess 从站点根目录重定向到公共文件夹,在 URL 中隐藏“公共”?【英文标题】:.htaccess redirect from site root to public folder, hiding "public" in URL? 【发布时间】:2014-07-01 09:25:12 【问题描述】:

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

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 文件时犹豫不决,因为我在这里和网上看到了很多相互矛盾的建议,关于最好的方法。

【问题讨论】:

为什么首先需要一个公共目录? 如果您在共享主机上,那么做您想做的事情的唯一方法就是通过 .htaccess。如果您有 VPS,则可以使用托管设置将服务器指向该公用文件夹。 @AndrewBarber:我想对它没有要求,我只是想尽可能地保持我的前端和逻辑代码分开,这种结构有助于我保持井井有条。不过,我愿意接受建议,我是大型 PHP 项目的新手 :) 嗯,通常期望站点的根目录是“公共”部分。但是,如果您有根本不想通过请求访问的代码,它应该完全不在网络目录中,正如@CheckeredMichael 所指出的那样。 @CheckeredMichael:是的共享主机。我知道我需要通过.htaccess 来完成它我只是不确定哪些命令可以完成我需要的两件事。我是否需要根目录中的 .htaccess 来重定向到 /public/ 文件夹,然后在 /public/ 中使用另一个来格式化 URL? 【参考方案1】:

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

【讨论】:

这是部分工作,除了返回 404 的图像外,所有内容都会加载。这是因为我使用的是retina images for PHP,它让我在/public/ 目录中创建了一个.htaccess,它将图像请求重定向到视网膜等效项。有没有办法让这两种方法一起玩得很好? 可以的,可以发一下/My-Project/public/.htaccess的.htaccess吗? @pathros:它是有效且经过测试的解决方案。您可以发布一个包含所有详细信息的新问题,以解决您的问题。 我得到 Request exceeded the limit of 10 internal redirects due to probable configuration error. This 为我工作。 注意:如果你使用 XAMPP 或类似的,你的/htdocs/my-project/.htaccess文件也应该使用RewriteBase /my-project/【参考方案2】:

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

DirectoryIndex public/index.php public/index.html

【讨论】:

@Pathros 一定要放在重写引擎语句之后 @anubhava 的答案更好,因为它会重定向所有 http 请求,例如,这个答案不会重定向 css 和 js 资源查询【参考方案3】:

我对@anubhava 对在 localhost 和友好 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

你好

发布/新建

【讨论】:

似乎只加载pub/index.php - 不加载相关页面?【参考方案4】:

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

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

【讨论】:

它有效,但如果我在 URL 中公开它也有效,因为谷歌已经用 public 索引了 URL。你知道有什么方法可以将公开的网址重定向到不公开的网址吗?我试过这样写:RewriteRule ^public/(.*)$ /$1 [R=301,L] 但它不起作用。 因为我们将所有内容都路由到 /public,所以您必须在上面的代码指定 URL 之前,这样它才能正确找到路由。在您的公用文件夹中创建一个新的 htaccess 并将此代码 RewriteEngine 添加到 RewriteRule ^public/(.+)$ example.com/$2 [R=301,L] 用您自己的 url 替换 url

以上是关于.htaccess 从站点根目录重定向到公共文件夹,在 URL 中隐藏“公共”?的主要内容,如果未能解决你的问题,请参考以下文章

htaccess 301 重定向整个目录

使用 htaccess 将请求 uri 重定向到镜像站点

Htaccess 将所有文件从一个域中的子目录重定向到另一个域

.htaccess 将子域重定向到外部 URL

重定向但需要弄清楚在多站点 wordpress 结构中忽略 .htaccess 中的目录

使用 htaccess 重定向整个站点