【问题标题】:How do I get rid of the need for the "/app.php/" in a new Symfony2 app's production URL?如何在新的 Symfony2 应用程序的生产 URL 中摆脱对“/app.php/”的需求?
【发布时间】:2015-07-21 23:52:33
【问题描述】:

我已经完成了 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

我看到了预期,

“你好!”

我想重写生产 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

iiuc,默认web/.htaccess

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

需要改变。

我在文档和网络上进行了研究,尝试了不同的建议来修改 RewriteRule、添加“永久重定向匹配”等,但我没有找到一个简单的方法

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

【问题讨论】:

    标签: mod-rewrite symfony


    【解决方案1】:

    我知道这是一个愚蠢的问题,但是是否为 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"
    

    编辑:

    如果这些都不起作用,您可以尝试将 RewriteBase 添加到 htaccess 文件:

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

    【讨论】:

    • 是的,这是一个 symfony 页面。我已经反复清除了 prod 和 dev 缓存,确保清除了浏览器缓存,重新启动了 apache,甚至重新启动了服务器——以防万一。据报道,without-app.php URL 始终失败。
    • 也许 RewriteBase 会做到。
    • 成功了。我尝试过“RewriteBase /”和“RewriteBase /app.php”,但没有尝试过“RewriteBase /TESTAPP”......认为既然它已经在主机规范中,那将是错误的。 :-/ 谢谢!
    • 我遇到了同样的问题,发现这是我使用 SSL 的事实。它让我疯狂了一天,试图弄清楚为什么我必须将 app.php 添加到所有内容中......然后我创建了一个非 SSL 的测试站点,一切都很好......非 SSL 站点 / = OK SSL 站点 / app.php = OK SSL 站点/ = 失败
    【解决方案2】:

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

    这样做:- 转到“/etc/apache2”修改文件“apache2.conf”部分:

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

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

    它应该工作。如果它不起作用,您仍然已经完成了 1 步以确保允许覆盖 .htaccess。上面的指令可以解决许多其他原因。

    【讨论】:

      【解决方案3】:

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

      RewriteBase /project_name
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-11
        • 2015-03-30
        • 2020-10-17
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        相关资源
        最近更新 更多