我有这个重写规则来将请求定向到我的 symfony 2 应用程序:
RewriteCond %{REQUEST_URI} ^/foo/.*$
RewriteRule ^/foo(/.*)$ /srv/webapps/symfony2/web/app.php [QSA,L]
如果我访问,http://test-server.com/foo/myController
我会收到一个 symfony 异常,告诉我它不知道如何路由foo/myController
。
我不想foo
在 symfony 中添加路由,因为应用程序还必须使用其他 URL 前缀。如何确保该foo
部分对 symfony 不可见?
答案1
最终我成功了。我的解决方案如下:
Alias /foo /srv/webapps/symfony2/web
<Directory /srv/webapps/symfony2/web >
AllowOverride None
Order allow,deny
Allow from all
Options +FollowSymLinks
RewriteEngine On
RewriteOptions Inherit
RewriteBase /foo
# prevent looping from internal redirects
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]
## redirect everything to app.php unless the file realy exists in /web
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ app.php [last]
</Directory>
我不知道为什么会发生这种情况,但别名和目录直接指向 symfony 文件夹似乎很重要web
。如果它们指向/srv/webapps/symfony2
并且最终重写指向,web/app.php
则将别名 root 添加到 URI 前面。
答案2
由于您似乎试图将对特定上下文路径(foo
)的请求重定向到单个文件,因此您可能会发现以下内容(修改自这个 Apache 文档)有用:别名/foo/srv/webapps/symfony2/web RewriteBase/foo
RewriteCond /srv/webapps/symfony2/web/%{REQUEST_FILENAME} !-f
RewriteCond /srv/webapps/symfony2/web/%{REQUEST_FILENAME} !-d
RewriteRule ^ app.php [PT]
</Directory>
编辑:或者,您可以修改原始解决方案以包含PT
将重写的 URI 传递给应用程序进行处理的标志,例如:
RewriteCond %{REQUEST_URI} ^/foo/.*$
RewriteRule ^/foo(/.*)$ /srv/webapps/symfony2/web/app.php [QSA,PT]
(请注意,这L
意味着PT
如文档中所述