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.php
和app_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 或别名,用于将文件夹更改为根目录