You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改RewriteBase后仍需输入public目录的.htaccess问题解决

解决访问cms.test时直接指向public目录的问题

看起来你踩了两个常见的小坑:服务器文档根目录没对准public文件夹,还有RewriteBase的配置搞错了方向。我来一步步帮你搞定:

核心问题分析

你的index.php在public目录,但当前服务器把cms.test的根目录指向了/var/www/cms(也就是cms文件夹本身),所以访问域名时会直接显示cms文件夹的内容,而不是自动加载public里的index.php。另外,RewriteBase应该用相对于域名的路径,不是服务器的绝对路径,你写的/var/www/cms/public是服务器本地路径,Apache根本识别不了这个作为RewriteBase。

解决方案1:修改Apache虚拟主机配置(推荐)

这是最规范的做法,直接把网站的文档根目录指向public文件夹:

  1. 找到你的Apache虚拟主机配置文件(通常在/etc/apache2/sites-available/cms.test.conf或者类似路径)
  2. 修改DocumentRoot和<Directory>路径为/var/www/cms/public,配置如下:
<VirtualHost *:80>
    ServerName cms.test
    DocumentRoot /var/www/cms/public

    <Directory /var/www/cms/public>
        AllowOverride All  # 确保允许.htaccess生效
        Require all granted
    </Directory>
</VirtualHost>
  1. 重启Apache服务:sudo systemctl restart apache2

解决方案2:修正public目录的.htaccess

配合上面的服务器配置,把public目录里的.htaccess改成下面的样子(修正RewriteBase,加上更规范的L标记):

Options -MultiViews
RewriteEngine On
RewriteBase /  # 现在网站根就是public,所以用/即可,甚至可以省略
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

L标记的作用是告诉Apache处理完这条规则后就停止,避免后续可能的冲突。

备选方案:如果无法修改服务器配置(比如共享主机)

如果没权限改虚拟主机,那就在/var/www/cms根目录(也就是public的父目录)新建一个.htaccess,把所有请求转发到public目录:

RewriteEngine On
# 处理根路径请求
RewriteRule ^$ public/ [L]
# 处理所有其他路径请求
RewriteRule (.*) public/$1 [L]

这样访问cms.test时,服务器会自动把请求转到public目录,地址栏不会显示public字样,同时保持public目录里的.htaccess正常工作。

做完上面的操作,再访问cms.test应该就能直接加载public里的index.php了,不用手动进入public目录。

内容的提问来源于stack exchange,提问作者Hasan Teoman Tıngır

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:44:48