修改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文件夹:
- 找到你的Apache虚拟主机配置文件(通常在
/etc/apache2/sites-available/cms.test.conf或者类似路径) - 修改
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>
- 重启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
相关产品推荐
相关产品推荐

