Slim框架去除/index.php及URL路由404问题排查求助
Slim框架路由404问题排查与修复
先帮你梳理下当前的环境和问题:
你的环境信息
- 操作系统:Ubuntu 14.04.6 LTS
- Web服务器:Apache 2.4.7
- 数据库:MySQL 5.6.33
- 项目目录结构:
/var/www/html/your-app |--public | |-- .htaccess | `-- index.php `--app |-- src | |-- controllers | | `-- WebController.php | `-- models | `-- WebModel.php |-- templates | |-- main.html | `-- signup.html |-- dependencies.php |-- middleware.php |-- routes.php `-- settings.php
问题现象
根路径访问没问题,不管是my_slim_url/index.php还是直接my_slim_url都能加载页面,但一点主页面的my_slim_url/signup链接,服务器就报错说找不到/register_email,这确实挺头疼的。
排查分析
我看了你贴的所有配置,大概率是这几个地方出了问题:
- Apache配置冲突:你在
apache2.conf和站点配置里都写了目录规则,路径还不对,而且混用了新旧Apache语法,容易导致解析异常; - .htaccess的重写根路径错了:
RewriteBase /可能没匹配你的实际项目访问路径,导致请求没正确转发到index.php; - 路由和前端链接不匹配:报错是找不到
/register_email,但你点的是/signup,要么是前端链接实际指向了/register_email,要么是路由里把/signup转去了这个路径但没定义路由。
修复方案
咱们一步步来改:
第一步:修正Apache配置
先改apache2.conf
找到里面的<Directory /var/www/html/public>这段,路径不对,你的项目public目录是/var/www/html/your-app/public,要么把这段路径改对,要么直接删掉,让站点配置的规则生效:
# 把这段删掉或者修正路径 # <Directory /var/www/html/public> # Options Indexes FollowSymLinks # AllowOverride All # Require all granted # </Directory> # 保留其他正确配置 <Directory /> Options FollowSymLinks AllowOverride All Require all granted </Directory> <ifModule dir_module> DirectoryIndex index.php </ifModule> AccessFileName .htaccess <FilesMatch "^\.ht"> Require all denied </FilesMatch>
再改/sites-available/000-default.conf
这里混用了Apache 2.2和2.4的语法,统一改成2.4的规则,还要确保DocumentRoot指向正确的public目录:
ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <VirtualHost *:80> # 如果有域名就填这里,没有就留空 ServerName your-domain.com # 关键:把站点根目录指向项目的public文件夹 DocumentRoot /var/www/html/your-app/public <Directory /var/www/html/your-app/public> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> </VirtualHost>
第二步:修正.htaccess的RewriteBase
编辑/var/www/html/your-app/public/.htaccess,RewriteBase要和你的项目访问路径一致:
- 如果你的项目是通过
http://xxx.com/your-app访问,就设为RewriteBase /your-app/; - 如果是直接绑定域名到public目录(比如
http://xxx.com直接访问),可以删掉RewriteBase或者设为/。
修改后的.htaccess:
<IfModule mod_rewrite.c> RewriteEngine On # 按需调整这行 RewriteBase /your-app/ # 加上这行排除实际存在的目录,避免干扰 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [QSA,L] </IfModule>
第三步:检查路由和前端链接
- 打开
app/routes.php,确认有没有/signup的路由,比如:
$app->get('/signup', '\App\Controllers\WebController:signup');
如果报错里的/register_email是这个路由里跳转的目标,那得确保/register_email也有对应的路由定义;
2. 去templates/main.html里看看signup链接的写法,确保路径正确:
<!-- 如果项目路径是/your-app,就这么写 --> <a href="/your-app/signup">Sign Up</a> <!-- 如果是根域名指向public,就写 --> <a href="/signup">Sign Up</a>
第四步:重启Apache让配置生效
执行命令:
sudo service apache2 restart
额外检查:确保mod_rewrite启用了
如果之前没启用过,执行这俩命令:
sudo a2enmod rewrite sudo service apache2 restart
这样应该就能解决问题了,你可以一步步试下来,每改完一步测试下访问情况。
内容的提问来源于stack exchange,提问作者김태현
相关产品推荐
相关产品推荐

