php/symfony2从URL隐藏app.php
请考虑以下URL: 这行不通。然而,这确实有效 我去掉了.htaccess文件,因为我想使用vhost文件并依赖Apache路由。我的vhost文件如下所示: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"
<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>