php/symfony2从URL隐藏app.php

php/symfony2从URL隐藏app.php,php,apache,symfony,url-rewriting,Php,Apache,Symfony,Url Rewriting,请考虑以下URL: 这行不通。然而,这确实有效 我去掉了.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"

请考虑以下URL:

这行不通。然而,这确实有效

我去掉了.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>

ServerName myurl.fr
ServerAlias www.myurl.fr
DocumentRoot/var/www/mysite/web
DirectoryIndex app.php
允许超越所有
通融
重新启动发动机
RewriteCond%{ENV:REDIRECT_STATUS}^$
重写规则^app\.php(/(.*)|$)%{CONTEXT_PREFIX}/$2[R=301,L]
重写规则[L]
RewriteCond%{REQUEST_FILENAME}-f
重写规则^(.*)$app.php[QSA,L]
RewriteCond%{REQUEST_URI}:$1^(/.+)(.+):\2$
重写规则^(.*)-[E=基:%1]
重写规则.?%{ENV:BASE}app.php[L]
我已清除Apache缓存并多次重新启动它。已启用URLEWRITE mod。我只是不知道还能查什么。知道我错过了什么吗

编辑
这可能是两个URL在给定的时间内都无法工作,因为我正在处理它。我的问题仍然有效。

将您的规则与symfony标准进行比较,我发现您在“通过所有规则”之前错过了文件检查。设法

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

重新启动发动机
RewriteCond%{REQUEST_URI}:$1^(/.+)/(.*):\2$
重写规则^(.*)-[E=基:%1]
RewriteCond%{ENV:REDIRECT_STATUS}^$
重写规则^app\.php(/(.*)|$)%{ENV:BASE}/$2[R=301,L]
#如果请求的文件名存在,只需提供它即可。
#我们只想让Apache服务于文件,而不是目录。
RewriteCond%{REQUEST_FILENAME}-f
重写规则[L]
#将所有其他查询重写到前端控制器。
重写规则.?%{ENV:BASE}/app.php[L]

将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>
ServerName my-site.fr
DocumentRoot/var/www/mysite/web
DirectoryIndex app.php
选项-索引位于SymLinks SymLinksFownerMatch之后
允许超越所有
通融

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

所以,如果你正把头撞在墙上,想知道为什么什么都不管用,试试这个。这可能会挽救你的理智和你的项目!快乐编码

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

a2enmod rewrite
如果您有Apache2.4,请检查您的配置文件,该文件不是
orderallow.deny,而是

Require all granted
下面是目录指令中的配置示例

AllowOverride all
Require all granted

@伊卡洛斯门德斯:你提出的“重写sudoa2enmod”的建议真的救了我一天

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

  • 首先运行“sudo a2enmod rewrite”
  • 从复制代码,将其置于“/etc/apache2/sites available”下
  • 请注意,有500个错误的人,检查项目文件夹下的var是否有777个错误

  • 将此代码添加到您的apacheconf /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>
    
    
    服务器管理员webmaster@localhost
    DocumentRoot/var/www/html/web/
    DocumentRoot/var/www/html/web
    不允许超限
    命令允许,拒绝
    通融
    选项-多视图
    重新启动发动机
    重写cond%{REQUEST_FILENAME}-F
    重写规则^(.*)$app.php[QSA,L]
    
    您可以将
    AllowOverride All
    更改为
    AllowOverride None
    。不太可能解决你的问题。是的,那不会解决我的问题:)那确实有效!但是,我的css、图像和脚本不再存在。我该如何解决这个问题?我想我应该有一个规则来忽略这些类型文件的重写?好的,我添加了三个规则来忽略css、img和js文件夹,这样它们就不会被重写。我已经用这3条规则编辑了你的答案,所以我可以把它标记为答案。非常感谢。@Sam css、img和js文件夹的忽略规则在哪里?谢谢,我发现apache默认情况下没有启用mod_rewrite,当我启用它时,我的配置工作得非常好,很高兴我至少能帮助一个人@伊卡洛斯·门德斯——2号。谢谢@伊卡洛斯门德斯谢谢你。。您的评论“如果您使用Apache,您必须确保启用mod_rewrite!
    sudo a2enmod rewrite
    ”对我>从symfony复制代码很有帮助,请将其放在“/etc/apache2/sites available”下什么?这不应该起作用,可用的站点是保存apache vhost配置的地方。这就是我的意思。从第节复制代码的第二节。此语法导致apache出现错误。更好地使用开发的语法,一行一条指令。就像在symfony的文档上一样是的,我的答案有点过时了,已经5年了,现在你可以使用非官方的apache配置,我们当时没有
    <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>