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

5 mod-rewrite symfony

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

    php app/console --version
        Symfony version 2.0.11 - app/dev/debug
Run Code Online (Sandbox Code Playgroud)

我通过配置我的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>
        ...
Run Code Online (Sandbox Code Playgroud)

安装完成后,成功按照"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
Run Code Online (Sandbox Code Playgroud)

我看到了预期的,

"你好我!"

我想重写生产URL,隐藏"app.php",以便以下一组URL在我的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
Run Code Online (Sandbox Code Playgroud)

Iiuc,默认的web/.htaccess

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

需要改变.

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

HTTP://本地主机/ TESTAPP /你好/ ME

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

我需要做出哪些具体改变才能使其发挥作用?

谢谢.


@chasen

是否为apache启用了mod_rewrite?

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

我做

并且你托管指向web文件夹的文件

如上所述,

    Alias /TESTAPP  "/srv/www/TESTAPP/web/"  
        <Directory "/srv/www/TESTAPP/web/">  
Run Code Online (Sandbox Code Playgroud)

不应该需要app.php.

那是我的问题.没有它,它对我不起作用.

特别,

    https://localhost/TESTAPP/app.php/hello/ME
Run Code Online (Sandbox Code Playgroud)

收益:

"你好我!"

    https://localhost/TESTAPP/hello/ME
Run Code Online (Sandbox Code Playgroud)

回报

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
Run Code Online (Sandbox Code Playgroud)

cha*_*sen 14

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

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

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

sudo a2enmod rewrite
sudo service apache2 reload
sudo service apache2 restart
Run Code Online (Sandbox Code Playgroud)

这应该启用mod,并重新加载apache.

编辑:

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

php app/console cache:clear --env="prod"
Run Code Online (Sandbox Code Playgroud)

编辑:

如果这些都没有工作,您可以尝试将RewriteBase添加到htaccess文件:

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