【问题标题】:RewriteRule in Apache with Symfony2 not removing app.phpApache 中的 RewriteRule 与 Symfony2 不删除 app.php
【发布时间】:2012-01-15 12:28:41
【问题描述】:

我的 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 应用程序的结构,我无法将 app.php 或 app_dev.php 移动到 Web 文件夹之外,也无法修改 Apache 的服务器配置,因此我正在寻找解决此问题的替代方案.

【问题讨论】:

    标签: apache symfony rewrite


    【解决方案1】:

    我今天遇到了这个问题,解决方法是在 url 重写规则的末尾附加 /$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>
    

    【讨论】:

      【解决方案2】:

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

      1. 首先,我将 app.php 从 web 目录中移出一步,因此我的 app.php 位于根目录中。 然后我在根目录下放了一个.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 目录。

      对我来说效果很好。

      【讨论】:

      • 很抱歉直言不讳,但这很荒谬。 web/ 文件夹的存在是有原因的。你不应该让 PHP 文件对公众可见。将虚拟主机指向web/文件夹,并调整重写条件删除app.php,或者使用包含app.php的index.php。这样,您就不会接触提供的框架代码......并且不会将您的代码暴露给可能被公开阅读的代码#想象一下您有这个可用的。 AddType application/x-httpd-php-source php
      • @neeraj:我按照你的建议遵循了第二个选项,但是当我点击我的 URL localhost/symfony 时我得到一个空白页我也不想使用 VirtualHost...请建议。跨度>
      【解决方案3】:

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

      这样做:

      1. 运行命令行命令“a2enmod rewrite”。
      2. 将所有“AllowOverride None”行更改为“AllowOverride All”。

      http://www.lavluda.com/2007/07/15/how-to-enable-mod_rewrite-in-apache22-debian/

      【讨论】:

      • 我有一个运行在 example.com 上的网站,托管在 NameCheap 上,而 Symfony2 项目在 app.example.com 上托管在 AWS 上。我尝试了所有方法,这立即解决了问题
      • 这应该是答案
      【解决方案4】:

      我刚遇到同样的问题,我是这样解决的:

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

      【讨论】:

        【解决方案5】:

        重写规则并不意味着从 URL 中删除 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
        

        【讨论】:

        • 无需“删除” app.php 部分。正如 symfony 文档所说,将 DocumentRoot 放入 web 目录是正确的,但是前往任何路线都会自动通过 app.php 进行路由。因此,例如,如果您转到 www.acme.com/blog/article/1,默认的 .htaccess 重写将路由到 www.acme.com/app.php/blog/article/1,但无需直接导航到其中包含 app.php 的路径。抱歉,如果我错过了您的帖子,但可能需要澄清一下:默认情况下,用户不需要浏览 app.php。
        • 你是对的 - 由于.htaccess 文件中的重写规则,app.php 无论如何都会被使用。我的RedirectMatch 指令所做的是不让用户显式 转到app.php。如果用户以某种方式访问​​www.acme.com/app.php/home,她将被重定向到www.acme.com/home——仅此而已。
        • 即使在用户维护单个主机名/域的情况下,我们真的需要虚拟主机吗?
        • 没有虚拟主机这可能吗?
        • 在使用共享主机且无法更改 .ini 文件时,如何仅使用 .htaccess 来实现。
        【解决方案6】:

        我们也一直在为此苦苦挣扎。有两种解决方案:

        1. 将虚拟主机的文档根目录设置为直接指向/web/ 子文件夹(根据 Symfony2 指南)
        2. app.phpapp_dev.php 移出/web/ 子文件夹,然后更新.htaccess 并相应地在两个文件中包含路径(即删除web/ 以在手动移动文件后更正所有路径上面的文件夹)

        (注意:无法提供 S2 的 vanilla 安装示例,因为 symfony.com 目前似乎已关闭。)

        【讨论】:

        • 为什么投反对票?这是解决 OP 问题的有效解决方案 - 请解释一下,谢谢。
        • 不幸的是,由于我的限制,我无法将 VirtualHost 的文档根目录设置为直接指向 web 子文件夹,因此这种方法不适用于我的情况。 :(
        • @celestialorb:是的,我认为是这样的——这就是我提供上面第二个选项的原因。在我们的案例中,我们必须在现有站点的子目录中托管一个 S2 支持的站点,因此我们无法使用第一个选项。通过 .htaccess 重写 URL 会导致 S2 中的路径自动检测出现几个问题(因为我们距离文档根目录有 2 层深)。上面答案中的第二个选项解决了它,它也适用于您的情况。
        • @MicE 您能否解释一下移动 app.php 和 app_dev.php 后 .htaccess 的样子?另外,是否需要在根目录下创建另一个 .htaccess?
        【解决方案7】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-05-08
          • 1970-01-01
          • 2012-09-10
          • 2012-03-25
          • 1970-01-01
          • 2013-08-19
          • 2012-06-24
          • 2014-06-26
          相关资源
          最近更新 更多