我的Symfony 2安装位于共享托管网站上。目录结构:
public
|-- api // subdomain api.mydomain.com
|-- app
|-- bin
|-- m // subdomain m.mydomain.com
|-- src
|-- vendor
|-- www // symfony "web" folder
| |
| +-- app.php // front controller!
文件夹www
是主文件夹,它是前端控制器所在的文件夹。它与mydmain.com
或www.mydomain.com
绑定在一起。 m.mydomain.com
或api.mydomain.com
之类的子域是public
之内的文件夹(即m
或api
)。
我没有SSH访问权限,只有FTP(没有SFTP)。问题不是重复www
和m
文件夹中api
的内容。 如果我将所有内容从www
复制到api
(比如说)前控制器正在运行,我就可以使用Symfony 2中的子域。
到目前为止我尝试过:
创建符号链接api
poiting到www
文件夹。我使用了www
文件夹中的folling脚本:
<?php
var_dump(__DIR__); // /htdocs/public/www where script is executed
$target = '/htdocs/public/www';
$link = '/htdocs/public/api';
if(file_exists($link)) {
if(is_link($link)) {
echo "unlinking $link...";
var_dump(unlink($link));
echo "symlinking $link to $target...";
var_dump(symlink($target, $link));
} else {
exit("$link exists but not symbolic link\n");
}
}
echo readlink($link); // /htdocs/public/www correct!
echo exec('cd .. && ls -l');
输出:
/htdocs/public/www
unlinking /htdocs/public/api... bool(true)
symlinking /htdocs/public/api to /htdocs/public/www... bool(true)
/htdocs/public/www
drwxr-xr-x 7 nobody nobody 4096 Nov 25 18:57 www
创建了符号链接但是(这很奇怪)我无法通过FTP或文件管理器界面(web)看到它的连接。前控制器不起作用。符号链接就在那里,如果我尝试创建一个与符号链接同名的文件夹,我会收到错误。
如何将api
文件夹的所有请求路由到www
文件夹(或从api子域到www子域)?这个解决方案对我来说似乎不太正确(为什么301重定向为GET /users api.mydomain.com
)?
答案 0 :(得分:5)
我有完全相同的配置,并让它工作!唯一的区别是我将api.domain.com映射到www.domain.com/api而不是你的www.domain.com,所以我的api符号链接指向www / api,而不是www。
您可以使用下面描述的某个方案的修改不需要符号链接:
首先包括code to preserve HTTP/HTTPS protocol in redirections(我将假设所有示例的代码):
RewriteEngine on
RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [env=proto:https]
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [env=proto:http]
重定向代码:
RewriteCond %{HTTP_HOST} ^api\.domain\.com$ [NC]
RewriteRule ^(.*)$ %{ENV:proto}://domain.com/api/$1 [L]
这会将所有请求api.domain.com/$1
重定向到domain.com/api/$1
。或者,如果愿意,您可以使用http://domain.com/$1
。
编辑:如果您不想对域进行硬编码,可以使用%N backreferences:
# don't forget to use the HTTP/HTTPS handling code above
RewriteCond %{HTTP_HOST} ^api\.([a-zA-Z0-9-]+\.[a-zA-Z0-9-]+)$ [NC]
RewriteRule ^(.*)$ %{ENV:proto}://%1/api/$1 [L]
I)关于符号链接,很奇怪你没有在FTP上看到符号链接。我在FileZilla中看到它作为一个目录(好像它是一个硬链接)。尝试安装FileZilla(并使用显式FTP over TLS进行安全身份验证)。
II)必须启用Options +FollowSymLinks
,但在大多数托管环境中you cannot set it yourself。取决于托管公司是否允许您AllowOverride Options
进行此设置。你可以很容易地找到:
Options +FollowSymLinks
放入/htdocs/public/.htaccess 如果此操作失败,您必须要求您的托管服务提供商全局设置Options +FollowSymLinks
,或全局允许AllowOverride Options
。
我实际上有4种方案(您可以在我的域上在线测试)使用不同的方法(假设主目录在您的情况下命名为/ public):
1)avif.birds.cz重定向到birds.cz/avif/(规范) - 带符号链接的解决方案
/ public / avif - 符号链接到/ public / www / avif
/public/www/avif/.htaccess:
RewriteCond %{HTTP_HOST} ^avif\.birds\.cz$ [NC]
RewriteRule ^(.*)$ %{ENV:proto}://birds.cz/avif/$1 [L]
2)cap.birds.cz重定向到birds.cz/avif/some_url(根本不需要符号链接)
/public/.htaccess:
RewriteCond %{HTTP_HOST} ^(www\.)?cap\.birds\.cz$ [NC]
RewriteRule ^(.*)$ %{ENV:proto}://birds.cz/avif/cap_intro.php [L]
3)(www。)birds.cz/jpsp重定向到jpsp.birds.cz(规范)
/ public / jpsp - 符号链接到/ public / www / jpsp
/public/www/jpsp/.htaccess:
RewriteCond %{HTTP_HOST} !^jpsp\.birds\.cz$ [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^(.*)$ %{ENV:proto}://jpsp.birds.cz/$1 [L]
4)www.rorysi.cz - 由同一棵树提供服务的别名域名(rorysi.cz必须保留为规范域名)
此域的PHP源代码不同,位于/ public / www / rorysi。
/public/www/.htaccess:
RewriteCond %{HTTP_HOST} ^(www\.)?rorysi\.cz$ [NC]
RewriteCond %{REQUEST_URI} !^/rorysi/ [NC]
RewriteCond %{REQUEST_URI} !=/rorysi [NC]
RewriteCond %{REQUEST_URI} !^/lib/ [NC]
RewriteRule ^(.*)$ %{ENV:proto}://www.rorysi.cz/rorysi/$1 [L]
注意:lib目录包含PHP库和内联函数,因此我不希望将其重定向。
也许其中一些场景可能对您有所帮助或鼓舞人心。
答案 1 :(得分:2)
1)确保你有
Options +FollowSymLinks
在.htaccess文件中。
答案 2 :(得分:1)
如果您的网络SP上的修改权限太有限,实际上这可能是不可能的。 您需要逐个测试解决方案,看看它们是否有效。 首先检查.htaccess文件的访问权限,因为服务器通常需要非常严格的访问权限,如果不匹配,则忽略.htaccess文件。
如果在.htaccess访问检查之后,你的网络SP仍然不允许像apoq写的那样改变符号链接,那么我将按以下顺序测试以下内容:
但由于所有这些都取决于您自己的.htaccess文件中允许更改的内容,因此您可能无法通过.htaccess文件更改任何内容。