使用Symfony2的Apache中的RewriteRule不删除app.php

时间:2011-12-08 00:39:29

标签: apache symfony rewrite

我的Web目录中有以下.htaccess文件,用于我的Symfony2安装:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*) app.php [QSA,L]
</IfModule>

然而,当我尝试一些基本的东西,如:

(whatever)/web/app.php/place

它不会从URL中删除app.php。我是Apache的新手,我不确定这里发生了什么,有人可以解释一下吗?提前谢谢!

编辑: 由于我正在使用的Web应用程序的结构,我无法移动web文件夹之外的app.php或app_dev.php,也无论如何我也无法修改Apache的服务器配置,因此我正在寻找这个问题的替代解决方案

7 个答案:

答案 0 :(得分:25)

您必须在Apache中启用重写模块,如“IfModule mod_rewrite.c”所述。

这样做:

  1. 运行命令行命令“a2enmod rewrite”。
  2. 将所有“AllowOverride None”行更改为“AllowOverride All”。
  3. 请参阅http://www.lavluda.com/2007/07/15/how-to-enable-mod_rewrite-in-apache22-debian/

答案 1 :(得分:21)

重写规则并不意味着从网址中删除app.php。它的目的是为每个请求使用app.php如果请求URL与真实文件不对应。由于app.php是真实文件,因此它将用于提供请求。

如果你想要摆脱web/app.php部分,首先要创建一个指向web文件夹的虚拟主机:

<VirtualHost *:80>
    ServerName whatever
    DocumentRoot /path/to/project/web
</VirtualHost>

这将删除web部分。

然后,要删除app.php部分,请将其添加到web/.htaccess文件的开头:

RedirectMatch permanent ^/app\.php/(.*) /$1

答案 2 :(得分:4)

我遇到了同样的问题,我修理了这个问题:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /web/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ app.php [QSA,L]
</IfModule>

答案 3 :(得分:4)

我今天遇到了这个问题,修复是在网址重写规则的末尾追加/ $ 1。

我的.htaccess看起来像这样:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ app.php/$1 [QSA,L]
</IfModule>

虚拟主机的定义如下:

<VirtualHost *:80>
   DocumentRoot /var/www/html/symfony_site/web
   DirectoryIndex app.php
   <Directory /var/www/html/symfony_site/web >
       AllowOverride All
       Allow from All
   </Directory>
</VirtualHost>

答案 4 :(得分:0)

当您写RewriteCond %{REQUEST_FILENAME} !-f时,您说“不要更改真实文件......它们应该仍然可以访问”。如果你删除它,它应该工作。

允许这样做的原因是某些框架允许您使用http://site.tld/script.php/abc=123&def=456样式的链接。

如果您希望它允许文件名,除了 app.php,您可以将其添加为另一个RewriteCond

答案 5 :(得分:0)

我们也一直在努力。有两种解决方案:

  1. 将虚拟主机的文档根目录设置为直接指向/web/子文件夹(根据Symfony2指南)
  2. app.phpapp_dev.php移到/web/子文件夹之外,然后更新.htaccess并相应地在两个文件中包含路径(即删除web/以更正所有文件手动将文件移到上面一个文件夹后的路径)
  3. (注意:无法提供来自S2的vanilla安装的示例,因为symfony.com目前似乎已经关闭。)

答案 6 :(得分:0)

我设法删除共享服务器上的web / app.php部分。

  1. 首先,我将app.php从web目录中移出一步,因此我的app.php在根目录上。 然后我在根目录
  2. 上放置了一个.htaccess
    RewriteEngine on
    
    RewriteBase /
    
    RewriteRule ^css/(.*) web/css/$1
    
    RewriteRule ^images/(.*) web/images/$1
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ app.php [QSA,L]
    

    我在css和图像上使用了RewriteCond,因为它们仍位于/ web /目录中,因此对css和图像的所有请求将分别路由到web / css和web / images目录。

    对我来说效果很好。