请考虑以下网址: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都不会在给定时间工作。我的问题仍然有效。
答案 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_rewritea2enmod rewrite
如果您有 apache 2.4 ,请检查您的配置文件,而不是Order allow.deny
Require all granted
以下是目录指令
中的示例配置AllowOverride all
Require all granted
答案 4 :(得分:1)
@icarlosmendez你的建议&#34; sudo a2enmod重写&#34;真的可以节省我的一天!
这就是我所做的,希望有些人会觉得有用
答案 5 :(得分:0)
将此代码添加到您的apache conf中 的 /etc/apache2/sites-available/000-default.conf 强>
并确保通过键入
启用mod_rewritea2enmod重写
<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>