php/symfony2 从 URL 中隐藏 app.php

Posted

技术标签:

【中文标题】php/symfony2 从 URL 中隐藏 app.php【英文标题】:php/symfony2 hiding app.php from the URL 【发布时间】:2013-08-19 08:13:17 【问题描述】:

考虑以下 URL:http://www.myurl.fr/accueil。

这行不通。但是http://www.myrurl.fr/app.php/accueil 确实有效。

我摆脱了 .htaccess 文件,因为我想使用 vhost 文件并依赖 Apache 路由。我的虚拟主机文件如下:

<VirtualHost my.ip.address>
ServerName myurl.fr
ServerAlias www.myurl.fr
DocumentRoot /var/www/mysite/web
DirectoryIndex app.php
<Directory "/var/www/mysite/web">
  AllowOverride All
  Allow from All
</Directory>

<IfModule mod_rewrite.c>
 RewriteEngine On  
 RewriteCond %ENV:REDIRECT_STATUS ^$  
 RewriteRule ^app\.php(/(.*)|$) %CONTEXT_PREFIX/$2 [R=301,L]
 RewriteRule .? - [L]
 RewriteCond %REQUEST_FILENAME -f
 RewriteRule ^(.*)$ app.php [QSA,L]
 RewriteCond %REQUEST_URI::$1 ^(/.+)(.+)::\2$
 RewriteRule ^(.*) - [E=BASE:%1]    
 RewriteRule .? %ENV:BASEapp.php [L]
</IfModule>
</VirtualHost>

我已经清除了 Apache 缓存并重新启动了很多次。启用了 urlrewrite 模块。我只是不知道还要检查什么。知道我错过了什么吗?

编辑 由于我正在处理它,这可能是两个 URL 在给定时间都不起作用。我的问题仍然有效。

【问题讨论】:

您可以将AllowOverride All 更改为AllowOverride None。不太可能解决您的问题。 是的,这不会解决我的问题 :) 【参考方案1】:

将此代码添加到您的 apache conf /etc/apache2/sites-available/000-default.conf

并确保通过键入启用 mod_rewrite

a2enmod 重写

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/web/
    DocumentRoot /var/www/html/web
    <Directory /var/www/html/web>
        AllowOverride None
        Order Allow,Deny
        Allow from All
        <IfModule mod_rewrite.c>
            Options -MultiViews
            RewriteEngine On
            RewriteCond %REQUEST_FILENAME !-f
            RewriteRule ^(.*)$ app.php [QSA,L]
        </IfModule>
    </Directory>
</VirtualHost>

【讨论】:

【参考方案2】:

@icarlosmendez 您对“sudo a2enmod rewrite”的建议真的节省了我的时间!

这就是我所做的,希望对某些人有帮助

    先运行“sudo a2enmod rewrite” 从symfony复制代码,放在“/etc/apache2/sites-available”下 只是给遇到 500 个错误的人的说明,请检查项目文件夹下的 var 是否有 777。

【讨论】:

> 从 symfony 复制代码,放在“/etc/apache2/sites-available”下什么?这应该不起作用,站点可用是保留 apache vhost 配置的位置。 这就是我的意思。从Apache with mod_php/PHP-CGI 部分复制代码的第二部分。【参考方案3】:

这里的关键解决方案是确保通过键入

启用 mod_rewrite
a2enmod rewrite

如果你有 apache 2.4,然后检查你的配置文件,而不是 Order allow.deny

Require all granted

这是 directory 指令中的示例配置

AllowOverride all
Require all granted

【讨论】:

【参考方案4】:

Symfony 文档为这个问题提供了直接的解决方案。

'<VirtualHost *:80>
    ServerName domain.tld
    ServerAlias www.domain.tld

    DocumentRoot /var/www/project/web
    <Directory /var/www/project/web>
        AllowOverride None
        Order Allow,Deny
        Allow from All

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

    # uncomment the following lines if you install assets as symlinks
    # or run into problems when compiling LESS/Sass/CoffeScript assets
    # <Directory /var/www/project>
    #     Options FollowSymlinks
    # </Directory>

    # optionally disable the RewriteEngine for the asset directories
    # which will allow apache to simply reply with a 404 when files are
    # not found instead of passing the request into the full symfony stack
    <Directory /var/www/project/web/bundles>
        <IfModule mod_rewrite.c>
            RewriteEngine Off
        </IfModule>
    </Directory>
    ErrorLog /var/log/apache2/project_error.log
    CustomLog /var/log/apache2/project_access.log combined
</VirtualHost>'

我想在这次讨论中补充一点是,如果没有以下考虑,这些优秀的建议都不会取得成果。

如果您使用的是 Apache,则必须确保启用 mod_rewrite!

`sudo a2enmod rewrite`

因此,如果您正在用头撞墙,想知道为什么没有任何效果,请试试这个。它可能会拯救你的理智和你的项目!编码愉快!

【讨论】:

谢谢,我发现apache默认没有启用mod_rewrite,当我启用它时,我的配置工作正常 很高兴我能够帮助至少一个人! @icarlosmendez - 制作 2。谢谢! @icarlosmendez 谢谢.. 您的评论“如果您使用 Apache,则必须确保启用 mod_rewrite!sudo a2enmod rewrite”对我有帮助【参考方案5】:

把 apache httpd.conf 虚拟主机代码改成这个

ServerName my-site.fr
<VirtualHost your.ip.address:80>
DocumentRoot /var/www/mysite/web
<Directory "/var/www/mysite/web">
DirectoryIndex app.php
Options -Indexes FollowSymLinks SymLinksifOwnerMatch
AllowOverride All
Allow from All
</Directory>
</VirtualHost>

【讨论】:

这个语法给了我一个 apache 错误。更好地使用已开发的语法,逐行执行一条指令。就像它在 symfony 的文档上一样 symfony.com/doc/current/setup/… 是的,我的回答有点过时了,它已经 5 岁了,现在你可以拥有我们当时没有的非官方 apache 配置【参考方案6】:

将您的规则与 symfony-standard .htaccess 进行比较,我发现您在“通过所有规则”之前错过了文件检查。试试看

<IfModule mod_rewrite.c>
    RewriteEngine On  

    RewriteCond %REQUEST_URI::$1 ^(/.+)/(.*)::\2$
    RewriteRule ^(.*) - [E=BASE:%1]
    RewriteCond %ENV:REDIRECT_STATUS ^$
    RewriteRule ^app\.php(/(.*)|$) %ENV:BASE/$2 [R=301,L]
    # If the requested filename exists, simply serve it.
    # We only want to let Apache serve files and not directories.
    RewriteCond %REQUEST_FILENAME -f
    RewriteRule .? - [L]

    # Rewrite all other queries to the front controller.
    RewriteRule .? %ENV:BASE/app.php [L]
</IfModule>

【讨论】:

确实有效!但是我的 css、图像和脚本不再被发现。我该如何解决?我想我应该有一个规则来忽略这些类型的文件的重写? 好的,我添加了三个规则来忽略 css、img 和 js 文件夹,这样它们就不会被重写。我已经使用这 3 条规则编辑了您的答案,因此我可以将其标记为答案。非常感谢。 @Sam css、img 和 js 文件夹的忽略规则在哪里?

以上是关于php/symfony2 从 URL 中隐藏 app.php的主要内容,如果未能解决你的问题,请参考以下文章

PHP symfony2 引导资产:转储错误

从URL隐藏目录

Windows 7 php + Symfony2 非常慢

CodeIgniter - 如何从 URL 中隐藏 index.php

如何从 URL 传递关键字但将其隐藏? (广告词)

从 url 隐藏目录名称和 index.php