Symfony 3.4路由无法正常工作问题求助
Since you’ve confirmed php bin/console debug:router shows the route exists and you’ve cleared cache, let’s narrow down the likely culprits specific to Symfony 3.4’s routing system:
1. Verify Annotations Route Loading Configuration
Symfony 3.4 relies on explicit imports to load annotation-based routes. First, check your config/routes/annotations.yaml—it should point to your Controller directory correctly (assuming you’re using the default AppBundle structure):
# config/routes/annotations.yaml app: resource: '@AppBundle/Controller/' type: annotation
If you’ve structured your controllers outside of AppBundle (e.g., src/App/Controller/), adjust the resource path to match: resource: '../src/App/Controller/'
Next, ensure this annotations file is imported in your main config/routes.yaml:
# config/routes.yaml app_routes: resource: './routes/annotations.yaml' prefix: /
Without this import, Symfony won’t pick up your annotation routes—even if debug:router shows them (sometimes cached entries can linger if you ran the command before fixing imports).
2. Double-Check Controller Annotation Syntax
A tiny typo in your route annotation can break things. Confirm your Controller action looks like this (pay attention to namespace and annotation formatting):
// src/AppBundle/Controller/LegalController.php namespace AppBundle\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Response; class LegalController extends Controller { /** * @Route("/legal", name="legal") */ public function legalAction() { return new Response('Legal page content'); } }
- Make sure you’ve imported the
@Routeannotation (viause Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;) - Avoid typos like lowercase
@route(annotations are case-sensitive) - Ensure the Controller class and filename follow PSR-4 (e.g.,
LegalController.phpmatches class nameLegalController)
3. Clear Cache for the Correct Environment
If you’re testing in production, the default cache:clear command only clears the dev environment. Run this to clear prod cache explicitly:
php bin/console cache:clear --env=prod
Symfony 3.4 caches route configurations aggressively in prod, so even small config changes require a full prod cache clear.
4. Validate Web Server Configuration
Symfony 3.4 uses web/ as the document root (not public/ like newer versions). Ensure your web server is pointing to this directory and correctly forwarding requests to app.php:
For Apache:
Check that web/.htaccess exists (it should be generated by Symfony by default). If missing, re-add the standard Symfony 3.4 .htaccess content:
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$ RewriteRule ^(.*) - [E=BASE:%1] RewriteCond %{HTTP:Authorization} . RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L] RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^ - [L] RewriteRule ^ %{ENV:BASE}/app.php [L] </IfModule>
For Nginx:
Ensure your server block has the correct root and try_files directive:
server { listen 80; server_name your-domain.com; root /path/to/your/project/web; location / { try_files $uri $uri/ /app.php$is_args$args; } location ~ ^/app\.php(/|$) { fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; # Adjust PHP version/socket fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT $realpath_root; internal; } location ~ \.php$ { return 404; } }
If your web server isn’t forwarding requests to app.php, Symfony’s router never gets a chance to handle the /legal request, resulting in a 404.
5. Confirm Route Prefixes
Check if any global route prefixes are applied in routes.yaml that might be modifying your /legal route. For example, if you have a prefix: /admin in your app_routes import, your actual route would be /admin/legal instead of /legal.
内容的提问来源于stack exchange,提问作者scandel

