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

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,这确实挺头疼的。

排查分析

我看了你贴的所有配置,大概率是这几个地方出了问题:

  1. Apache配置冲突:你在apache2.conf和站点配置里都写了目录规则,路径还不对,而且混用了新旧Apache语法,容易导致解析异常;
  2. .htaccess的重写根路径错了:RewriteBase /可能没匹配你的实际项目访问路径,导致请求没正确转发到index.php;
  3. 路由和前端链接不匹配:报错是找不到/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>

第三步:检查路由和前端链接

  1. 打开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,提问作者김태현

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:14:45