.htaccess 如何为 public_html cpanel 工作

Posted

技术标签:

【中文标题】.htaccess 如何为 public_html cpanel 工作【英文标题】:How .htaccess works for public_html cpanel 【发布时间】:2019-04-02 02:14:14 【问题描述】:

我在根目录中上传了一个 Laravel 项目:home/user/my-project-directory,在public_html 中我有一个目录 some-directory-name。在这个目录中,我有一个公共的 Laravel 目录。

我不明白的部分是,我应该在哪里有一个.htaccess 文件?在public_html 目录或public_html 的每个目录中?

此时,当我访问 www.mydomain.ro 时,我得到了 public_html 目录的索引。选择 some-directory-name 后,我就可以访问我的网站了。

我为什么要问这个...如果我在 public_html 中有一个 .htaccess 文件,在 public_html/some-directory-name 中有一个 .htaccess 文件,或者如果我没有其中任何一个,该网站仍然可以正常工作。

【问题讨论】:

【参考方案1】:

我不明白的部分是,我应该在哪里有一个.htaccess 文件。在public_html 目录或public_html 的每个目录中?

这取决于您要达到的目标。但是在站点的文档根目录中只有一个.htaccess 文件是很常见的。文档根目录下的.htaccess文件可以控制整个目录树。子目录中的.htaccess 文件会覆盖父.htaccess 文件并仅控制目录树的那个分支。

如果您想隐藏/重写 URL 路径中的 some-directory-name,那么您不能仅使用 some-directory-name 子目录中的 .htaccess 文件来执行此操作,您需要使用 .htaccess 中的文件父目录。

如果您在每个目录中都有一个.htaccess 文件,那么它会变得非常混乱且难以维护。但这样做是有理由的(但您不必这样做)。

您也可以将 .htaccess 文件放在文档根目录上方 - 但这可能没有任何作用,具体取决于您的服务器配置。

如果我在public_html 中有一个.htaccess 文件,在public_html/some-directory-name 中有一个.htaccess 文件,或者如果我没有其中任何一个,网站仍然可以正常运行。

那么也许您不需要.htaccess 文件。但是,如果您没有 .htaccess 文件,您将如何通过 Laraval 路由“漂亮”的 URL?

顺便说一句,如果您有权访问服务器配置,那么您根本不需要使用 .htaccess

旁白: 为什么你有一个/some-directory-name/public/ 形式的目录结构(公共 URL 路径)?这是故意的吗?


更新:

我想做的是通过www.mydomain.ro而不是www.mydomain.ro/some-dir-name访问我的网站

在这种情况下,您需要使用文档根目录中的.htaccess 文件来在内部重写/some-dir-name 子目录的所有请求。例如:

RewriteEngine On
RewriteCond %ENV:REDIRECT_STATUS ^$
RewriteRule ^ /some-dir-name%REQUEST_URI [L]

您还需要确保项目中的所有 URL 都不包含 /public-dir-name URL 路径。

这也会使/public-dir-name 目录之外的所有 URL 都无法访问。如果您特别需要访问这些文件,则可以添加其他条件。

检查REDIRECT_STATUS 环境变量的条件是确保不会出现重写循环。

更新#2:如果您特别需要它仅适用于一个主机名,例如。 example.com(并排除所有其他主机名/子域)然后添加附加条件:

RewriteEngine On
RewriteCond %HTTP_HOST ^example\.com [NC]
RewriteCond %ENV:REDIRECT_STATUS ^$
RewriteRule ^ /some-dir-name%REQUEST_URI [L]

更新#3:要使其也适用于子域,您可以修改 CondPattern 以使子域成为可选。例如:

RewriteCond %HTTP_HOST ^(subdomain\.)?example\.com [NC]

或者,添加一个附加条件并使用OR 标志。例如:

RewriteCond %HTTP_HOST ^example\.com [NC,OR]
RewriteCond %HTTP_HOST ^subdomain\.example\.com [NC]

【讨论】:

我想做的是通过 www.mydomain.ro 访问我的网站,而不是 www.mydomain.ro/public-dir-name,我认为我有一个 .htaccess 问题。我的结构是这样的: Home(root dir)/my-project-dir(all laravel app files without public dir) Home/public_html/some-dir-name(all public folder from laravel app) 此时,访问网站我需要这样:www.mydomain.ro/some-dir-name。我正在尝试摆脱 /some-dir-name 如果我这样做,我的子域将工作或所有的 URL 将指向 www.mydomain.ro? 只是为了说清楚....我需要编辑 home/user/public_html/some-dir-name 还是需要在 home/user/project 中创建一个 .htaccess 文件-dir 里面有你的代码吗? 这取决于您的子域在文件系统上指向的位置,但这很可能也会捕获您的所有子域。但是,您可以添加一个附加条件来仅重写您想要的域。我已经更新了我的答案。您只需要编辑文档根目录中的.htaccess 文件(大概是您的public_html 目录)。我假设你已经在 Laravel 根目录中有一个 .htaccess 文件。 您可以修改 CondPatternRewriteCond 指令的第二个参数是正则表达式)。我已经更新了我的答案。

以上是关于.htaccess 如何为 public_html cpanel 工作的主要内容,如果未能解决你的问题,请参考以下文章

如何为虚拟主机设置 htaccess 文件?

如何为多个子目录制定htaccess重写规则

如何为 Laravel 发布和自定义 .htaccess?

拒绝使用 htaccess 列出目录

如何为 .htaccess 文件中的某些媒体文件禁用 Apache gzip 压缩?

htaccess pcfg_openfile:无法检查 htaccess 文件,确保它是可读的并且“/files/domain.com/public_html/images/”是可执行的