我不明白的部分是,我应该在哪里有一个.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]