使用PHP脚本创建的符号链接没有显示,但它在那里?

时间:2013-11-25 20:18:36

标签: php symfony hosting subdomain shared-hosting

我的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.comwww.mydomain.com绑定在一起。 m.mydomain.comapi.mydomain.com之类的子域public之内的文件夹(即mapi)。

我没有SSH访问权限,只有FTP(没有SFTP)。问题不是重复wwwm文件夹中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)看到它的连接。前控制器不起作用。符号链接就在那里,如果我尝试创建一个与符号链接同名的文件夹,我会收到错误。

.htaccess解决方案

如何将api文件夹的所有请求路由到www文件夹(或从api子域到www子域)?这个解决方案对我来说似乎不太正确(为什么301重定向为GET /users api.mydomain.com)?

3 个答案:

答案 0 :(得分:5)

我有完全相同的配置,并让它工作!唯一的区别是我将api.domain.com映射到www.domain.com/api而不是你的www.domain.com,所以我的api符号链接指向www / api,而不是www。

.htaccess解决方案

您可以使用下面描述的某个方案的修改不需要符号链接

/htdocs/public/.htaccess:

首先包括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
  • 制作符号链接www / foo.php,指向www / app.php
  • 尝试访问foo.php
  • 或者,如果托管服务提供商允许您访问服务器日志,则可以查看日志中是否存在错误。

如果此操作失败,您必须要求您的托管服务提供商全局设置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写的那样改变符号链接,那么我将按以下顺序测试以下内容:

  • 首先是像Tomas一样测试重写。
  • 其次是尝试别名和scriptalias,因为别名只适用于 静态内容和脚本需要自己的别名规则。

但由于所有这些都取决于您自己的.htaccess文件中允许更改的内容,因此您可能无法通过.htaccess文件更改任何内容。