如何在新的Symfony2应用程序的生产URL中摆脱“/app.php/”的需要?

时间:2012-02-27 23:29:52

标签: mod-rewrite symfony

我已经完成了第一次安装Symfony2,

    php app/console --version
        Symfony version 2.0.11 - app/dev/debug

我通过配置我的apache2服务器vhost

将其安装在现有的DocumentRoot下
    <VirtualHost 127.0.0.1:80>
        ...
        DocumentRoot /srv/www/localhost_www
        ...
        <Directory "/srv/www/localhost_www" >
            AllowOverride none
            Options -ExecCGI +FollowSymLinks +Includes +Indexes +MultiViews
            Order Allow,Deny
            Allow from All
        </Directory>
        ...
        Alias /TESTAPP  "/srv/www/TESTAPP/web/"
        <Directory "/srv/www/TESTAPP/web/">
            Options All
            AllowOverride All
            Allow from All
        </Directory>

        Alias /TESTAPP.symfony  "/srv/www/TESTAPP/"
        <Directory "/srv/www/TESTAPP/">
            Options All
            AllowOverride All
            Allow from All
        </Directory>
        ...

安装完成后,成功关注“The Book”构建演示“Hello”应用程序,如果我在浏览器中导航到任何/所有,

  dev:
        http://localhost/TESTAPP.symfony/web/app_dev.php/hello/ME
        http://localhost/TESTAPP/app_dev.php/hello/ME
  prod:
        http://localhost/TESTAPP.symfony/web/app.php/hello/ME
        http://localhost/TESTAPP/app.php/hello/ME

我看到了预期的,

“你好我!”

我想重写生产网址,隐藏“app.php”,以便以下一组网址在我的Symfony2应用的浏览器导航栏中工作:

  dev:
        http://localhost/TESTAPP.symfony/web/app_dev.php/hello/ME
        http://localhost/TESTAPP/app_dev.php/hello/ME
  prod:
     !! http://localhost/TESTAPP.symfony/web/hello/ME
     !! http://localhost/TESTAPP/hello/ME

Iiuc,默认网页/ .htaccess

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

需要改变。

我在文档和网络上进行了挖掘,尝试了修改RewriteRule的vdiffferent建议,添加了“RedirectMatch永久”等等,而且我没有设法得到一个简单的

http://localhost/TESTAPP/hello/ME

永远的工作。我似乎总是需要添加“/app.php /".

为了让它发挥作用,我需要做出哪些具体改变?

感谢。


@chasen

  

是否为apache启用了mod_rewrite?

是的

  

如果您的网站目录中有.htaccess文件

我做

  

并托管指向Web文件夹的文件

如上所述,

    Alias /TESTAPP  "/srv/www/TESTAPP/web/"  
        <Directory "/srv/www/TESTAPP/web/">  
  

不应该使用app.php。

这是我的问题。没有它,它对我不起作用。

具体地,

    https://localhost/TESTAPP/app.php/hello/ME

返回:

“你好我!”

    https://localhost/TESTAPP/hello/ME

返回

Object not found!

The requested URL was not found on this server.
If you entered the URL manually please check your
spelling and try again.

If you think this is a server error, please contact
the webmaster.
Error 404

3 个答案:

答案 0 :(得分:14)

我知道这是一个愚蠢的问题但是为apache启用了mod_rewrite吗?

如果你的web目录中有.htaccess文件,并且你托管了指向web文件夹的文件,则不需要app.php。

如果你正在运行ubuntu或类似的发行版,你可以这样做:

sudo a2enmod rewrite
sudo service apache2 reload
sudo service apache2 restart

那应该启用mod,并重新加载apache。

编辑:

你回复的回复是在symfony页面吗?如果您的prod缓存可能需要清除,则从应用程序的根目录使用symfony控制台清除缓存:

php app/console cache:clear --env="prod"

编辑:

如果这些都没有用,你可以尝试在htaccess文件中添加RewriteBase:

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

答案 1 :(得分:3)

在我的情况下,我需要修改包含AllowOverride None的行以读取AllowOverride All。这告诉Apache,允许.htaccess文件覆盖以前的指令是可以的。您必须在此更改生效(https://help.ubuntu.com/community/EnablingUseOfApacheHtaccessFiles)之前重新加载Apache:

执行此操作: - 转到“/ etc / apache2”修改文件“apache2.conf”部分:

<Directory /var/www/>
    Options FollowSymLinks
    AllowOverride All
    Require all granted

  • 重启服务器:/ etc / apache2#service apache2 restart

它应该有用。如果它不起作用,你仍然做了一步确保.htaccess被允许覆盖。使用上述说明可以解决许多其他原因。

答案 2 :(得分:0)

将包含项目所在文件夹名称的RewriteBase规则添加到.htaccess文件中就可以了!谢谢!

RewriteBase /project_name