我的/var/www/html/app/
中有一个symfony应用程序,我想通过host/app/
访问它,但是我无法使其正常工作。
I have a conf file with this
<Directory /var/www/html/app>
AllowOverride All
Order Allow,Deny
Allow from All
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
# RewriteCond %{REQUEST_FILENAME} !-f
# RewriteCond %{REQUEST_FILENAME} !-d
# RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
</Directory>
它被评论是因为我试图在这里进行重定向,但是它没有用,所以我做了以下.htaccess。
/var/www/html/app/.htaccess
中的htaccess
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
使用此.htaccess,当我转到://host/app
时,我转到了symfony应用程序(不是apache目录结构),这似乎是一个不错的开始。
但是问题是我收到异常No Routes found for /app/
。
这是正常的,因为/app/
是服务器中的子文件夹,而不是symfony路由的开始。
如何在/app/
文件夹路径之后创建symfony路由?
我知道子文件夹中有一些关于symfony2 / 3路由的问题,但是答案需要分离src
和public
文件,这不是我想要的。
我只希望我的路线在访问://host/app
时起作用。
有关信息,当我访问://host/app/public/*Symfony routes*
编辑:
新app.conf
别名/ rapp“ / var / www / html / app / public”
<Directory /var/www/html/app>
AllowOverride None
Order Allow,Deny
Allow from All
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
#RewriteBase /app
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(?!public/index.php)$ public/index.php$1 [L]
</IfModule>
</Directory>
答案 0 :(得分:1)
我设法解决了这个问题!
我不确定配置是否正确,但似乎可以正常工作。
这是我的app.conf
工作文件(在/etc/apache2/sties-enabled/app.conf
中)
Alias /app "/var/www/html/app/public"
<Directory /var/www/html/app>
AllowOverride None
Order Allow,Deny
Allow from All
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteRule (/public) - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>
</Directory>
当我将RewriteRule
之类的网址重写为example.com/app/page-1
时,第一个example.com/app/public/index.php/page-1
是为了防止内部重写循环。
由于page-1
不是目录或文件,因此它将无限循环。
因此,我假设一旦有了/public
部分,重写就可以工作了,我们什么都不做就停止了重写,并以[L]
标志结束了重写。
但是,我不知道为什么必须删除“最终” public/
(RewriteRule
)中的RewriteRule ^(.*)$ index.php/$1 [L]
部分。
如果有人有改进此配置的想法,请随时发表评论。
答案 1 :(得分:0)
问题在于您的 Web服务器的文档根目录(apache将通过url公开的目录)和您的项目的文档根目录(公共目录)是不一样。相反,您的服务器指向项目目录。因此,您必须通过在网址中添加public/
来手动进入项目的文档根目录。
您应避免使项目目录可访问,因为这可能会暴露您的配置,从而使您的网站易受攻击,例如通过使用户可以通过配置内的凭据访问您的数据库。
通过将项目存储在其他位置,然后仅将项目的公共目录符号链接到/var/www/html/app
,您可能能够实现目标。这可能需要对您的apache配置进行一些更改,例如添加Options FollowSymLinks
。
另一种更为详尽的方法可能是使用mod_proxy
。配置大致如下所示:
# Your public server reachable from the outside
<VirtualHost *:80>
ProxyPass /app http://127.0.0.1:8080/
</VirtualHost>
# Your internal server where the requests are proxied to
<VirtualHost 127.0.0.1:8080>
<Directory /var/www/html/app/public>
AllowOverride All
Order Allow,Deny
Allow from All
</Directory>
...
</VirtualHost>
如您所见,内部Web服务器指向项目的文档根目录(公共目录)。您可能需要在apache设置和应用程序中都做其他操作,例如确保正确设置了受信任的代理或将ap ProxyPreserveHost On
添加到apache设置中,但这大致可以为您指明正确的方向。
编辑:我错过了另一个显而易见的解决方案,使用mod_alias
将您的symfony应用程序指向/app
:
Alias /app /var/www/html/app/public