首先,我要说的是,我对 Apache 指令几乎一无所知,但我需要在我的项目中使用它们来隐藏根文件夹,并隐藏 URL 的 /public 部分。
httpd配置文件
LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so
我知道 mod_rewrite 已启用,因为同一个项目中还有其他 .htaccess 文件可以正常工作。只有这个文件根文件夹似乎没有任何效果。
/public 文件夹中有效的 .htaccess 文件示例
<IfModule mod_rewrite.c>
Options -Multiviews
RewriteEngine On
RewriteBase /php_mvc/public
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
</IfModule>
.htaccess 文件不起作用
<IfModule mod_rewrite.c>
RewriteEngine On RewriteRule ^$ public/ [L] RewriteRule (.*) public/$1 [L]
</IfModule>
(更新)与以前相同的 .htaccess 文件,但重新格式化
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
</IfModule>
我的 .htaccess 文件中是否存在任何错误,或者我是否忽略了 Apache 配置中的某些内容以使其无法按预期工作?
请注意,我的目的是将访问者从根文件夹并放入民众子文件夹,并隐藏 URL 的 /public 部分,这样localhost/my_site/public
就变成了localhost/my_site/
。
我在 macOS Monterey 上本地运行 Apache,并启用了虚拟主机。我没有使用默认目录,而是将项目放在了其他位置。
httpd配置文件
DocumentRoot "/Users/mihkel/Documents/development/www"
<Directory "/Users/mihkel/Documents/development/www">
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.4/mod/core.html#options
# for more information.
#
Options Indexes FollowSymLinks
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# AllowOverride FileInfo AuthConfig Limit
#
AllowOverride None
#
# Controls who can get stuff from this server.
#
Require all granted
</Directory>
答案1
似乎我的编辑器 VSCode 试图自动格式化直接放置在根每当我保存文件时都会访问该文件夹。
本来应该是:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
</IfModule>
...最终结果是:
<IfModule mod_rewrite.c>
RewriteEngine On RewriteRule ^$ public/ [L] RewriteRule (.*) public/$1 [L]
</IfModule>
但子文件夹中的任何 .htaccess 文件都不存在这种情况。
这Apache 大会VSCode 的扩展解决了这个问题,但人们总是可以对 .htaccess 文件使用完全不同的编辑器。