如何在 Synology/DSM 6.1 的非 open-basedir 路径中使用 .htaccess

如何在 Synology/DSM 6.1 的非 open-basedir 路径中使用 .htaccess

我正在尝试使用 Rob Van Aarle 描述的技巧这里默认在 Synology 的网络服务器的“不允许的路径”中执行 php 页面……

目的是创建不依赖于“初始化第三方“(这个著名的软件包允许用户在他们的 Synology 上的 /volumeX/@appstore/ 等路径中运行 php 页面)

基本上,Rob 建议调用一个使用 php-cgi (/usr/local/bin/php56-cgi) 执行 php 页面的脚本

例如:调用这样的 cgi 来执行位于其旁边的页面 test.php。

#!/bin/sh
REDIRECT_STATUS=1 export REDIRECT_STATUS
SCRIPT_FILENAME=$(pwd)/test.php export SCRIPT_FILENAME
/usr/bin/php-cgi -d open_basedir=none $SCRIPT_FILENAME 2>&1

一切正常。

但 Rob 的完整想法是使用 .htaccess 将对任何 php 页面的调用重定向到通用 cgi 脚本。

.htaccess

# Turn on rewrite engine.
RewriteEngine on

# Rewrite existing php files to the router script.
# Apache on the Synology NAS automatically redirects url
# containing '../' to the corresponding real path, before
# the router script is executed, so it's impossible to
# execute system files.
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*\.php)$ router.cgi [PT,L,QSA,NE]

路由器

#!/bin/sh

# Set redirect_status to 1 to get php cgi working.
REDIRECT_STATUS=1 export REDIRECT_STATUS

# Fix several $_SERVER globals.
PHP_SELF=$SCRIPT_URL export PHP_SELF
SCRIPT_NAME=$SCRIPT_URL export SCRIPT_NAME

# Strip web base from SCRIPT_URL, concat it to parent directory
# and apply realpath to construct absolute path to requested script.
WEB_BASE="/webman/3rdparty"
SCRIPT_FILENAME=$(pwd)/..${SCRIPT_URL:${#WEB_BASE}}
SCRIPT_FILENAME=`realpath $SCRIPT_FILENAME`
export SCRIPT_FILENAME

# Execute the requested PHP file.
/usr/local/bin/php56-cgi -d open_basedir=none $SCRIPT_FILENAME 2>&1

我在 cgi 中添加了跟踪,但问题是它从未在我的 DSM 6.1 上调用过。因此,在我看来,.htaccess 未“启用”。具体来说,对 php 页面的调用正在下载该文件。

当 DSM 访问位于非允许路径的 php 页面时,是否假定在 Synology DSM 6.1 上使用 .htaccess?如果它应该工作,NAS 上可能配置错误?

非常感谢您分享这方面的经验!

这是演示包由 Rob 创建,用于说明他的帖子。

答案1

我终于搞清楚了问题所在。最新版本的 DSM 默认使用 nginx 而不是 apache 作为 Web 服务器。而 nginx不使用 htaccess 文件

相关内容