6

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

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

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

4

6 回答 6

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>
于 2013-08-17T05:30:52.027 回答
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`

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

于 2016-03-28T17:08:31.807 回答
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>
于 2013-08-17T13:32:20.487 回答
2

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

a2enmod rewrite

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

Require all granted

这是目录指令中的示例配置

AllowOverride all
Require all granted
于 2016-05-13T17:01:23.947 回答
1

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

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

  1. 首先运行“sudo a2enmod rewrite”
  2. 从symfony复制代码,将其放在“/etc/apache2/sites-available”下
  3. 只是给那些有 500 个错误的人的注释,检查项目文件夹下的 var 有 777。
于 2016-07-14T07:20:48.280 回答
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>
于 2018-02-16T00:21:52.530 回答