php / symfony2从URL隐藏app.php

时间:2013-08-16 20:17:34

标签: php apache symfony url-rewriting

请考虑以下网址:http://www.myurl.fr/accueil

它无效。但是http://www.myrurl.fr/app.php/accueil确实有用。

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

<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:BASE}app.php [L]
</IfModule>
</VirtualHost>

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

修改 可能是因为我正在处理它,两个URL都不会在给定时间工作。我的问题仍然有效。

6 个答案:

答案 0 :(得分:5)

将您的规则与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>

答案 1 :(得分: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`

所以,如果你的头撞在墙上,想知道为什么没有任何效果,试试这个。它可能会拯救你的理智和你的项目!快乐的编码!

答案 2 :(得分:2)

将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>

答案 3 :(得分:2)

此处的关键解决方案是确保通过输入

启用 mod_rewrite
a2enmod rewrite

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

Require all granted

以下是目录指令

中的示例配置
AllowOverride all
Require all granted

答案 4 :(得分:1)

@icarlosmendez你的建议&#34; sudo a2enmod重写&#34;真的可以节省我的一天!

这就是我所做的,希望有些人会觉得有用

  1. run&#34; sudo a2enmod rewrite&#34;第一
  2. symfony复制代码,将其放在&#34; / etc / apache2 / sites-available&#34;
  3. 只是给那些有500个错误的人留言,检查项目文件夹下的var是否为777。

答案 5 :(得分:0)

将此代码添加到您的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>