.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 将所有文件从一个域中的子目录重定向到另一个域