Apache 中的 RewriteRule 与 Symfony2 不删除 app.php

Posted

技术标签:

【中文标题】Apache 中的 RewriteRule 与 Symfony2 不删除 app.php【英文标题】:RewriteRule in Apache with Symfony2 not removing 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 的服务器配置,因此我正在寻找解决此问题的替代方案.

【问题讨论】:

【参考方案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 部分。

    首先,我将 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”所述。

这样做:

    运行命令行命令“a2enmod rewrite”。 将所有“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】:

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

    将虚拟主机的文档根目录设置为直接指向/web/ 子文件夹(根据 Symfony2 指南) 将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

【讨论】:

以上是关于Apache 中的 RewriteRule 与 Symfony2 不删除 app.php的主要内容,如果未能解决你的问题,请参考以下文章

apache设置.htaccess rewriteRule与laravel

htaccess 中的 Apache RewriteRule - 路由已损坏

Apache rewriterule 和 rewritecond 与 3 个域

apache config 中的 rewriterule 或别名,用于将文件夹更改为根目录

apache使用.htaccess文件中RewriteRule重定向后,URL中的加号无法解析

Apache RewriteRule丢弃SetInputFilter DEFLATE配置指令