使用 mod_rewrite 剥离部分 URI

使用 mod_rewrite 剥离部分 URI

我有这个重写规则来将请求定向到我的 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 如文档中所述

相关内容