关键不在“建目录”,而在让PHP正确执行脚本:Apache需配置AllowOverride All、.htaccess重写及权限;Nginx需用alias+try_files+正确SCRIPT_FILENAME;并检查权限、cgi.fix_pathinfo和入口一致性。

PHP 创建虚拟目录并线上部署,关键不在“建目录”,而在“让 PHP 能正确执行其中的脚本”。云服务器上常见失败不是建不成功,而是访问 /sub/index.php 时出现 No input file specified、404 或空白页——本质是 Web 服务器没把请求交给 PHP 解析。下面按实际生效顺序说明核心步骤。
一、确认 Web 服务器类型再操作
虚拟目录的实现方式完全取决于你用的是 Apache 还是 Nginx(IIS 在云服务器中极少使用,除非明确为 Windows Server):
-
Apache:靠
.htaccess+mod_rewrite实现路径映射,需开启AllowOverride All并确保模块已启用 -
Nginx:靠
location块和try_files规则重写 URL,不依赖 .htaccess,配置写在 server 块内 - 别在 Nginx 环境下找 .htaccess,也别在 Apache 下硬套 Nginx 的 rewrite 规则
二、Apache 下创建可运行的虚拟目录
假设你要把项目放在 /var/www/html/shop,希望它能像独立站点一样响应 https://yoursite.com/shop/xxx:
- 确保主站配置中该目录有权限:在
/etc/apache2/sites-available/000-default.conf或对应虚拟主机文件里,段内包含AllowOverride All和Require all granted - 在
/var/www/html/shop目录下新建.htaccess,内容为:<ifmodule mod_rewrite.c> RewriteEngine On RewriteBase /shop/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?/$1 [L] </ifmodule>注意RewriteBase必须与 URL 路径一致(如访问路径是/shop/,这里就写/shop/) - 重启 Apache:
sudo systemctl restart apache2
三、Nginx 下等效实现(更推荐)
Nginx 没有虚拟目录概念,但可通过 location 精准匹配子路径:
- 编辑你的站点配置(如
/etc/nginx/sites-available/yoursite),在server块内添加:location /shop/ { alias /var/www/html/shop/; try_files $uri $uri/ @shop; } location @shop { rewrite ^/shop/(.*)$ /shop/index.php?/$1 last; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_pass unix:/run/php/php8.0-fpm.sock; }重点:用alias(不是root)指向物理路径;SCRIPT_FILENAME必须设为$request_filename,否则会报 No input file specified - 测试并重载:
sudo nginx -t && sudo systemctl reload nginx
四、通用收尾动作(常被跳过导致失败)
无论 Apache 还是 Nginx,以下三点必须检查:
-
文件权限:确保 Web 用户(如 www-data 或 nginx)对
/var/www/html/shop及其子文件有读取+执行权限(目录 755,PHP 文件 644) -
PHP 配置:若项目用到 PATH_INFO(如 ThinkPHP/Laravel),确认
php.ini中cgi.fix_pathinfo=1已启用(Nginx 下尤其关键) -
入口一致性:所有请求最终都应落到
index.php,检查框架是否要求特定的base_url或APP_URL配置项,避免静态资源路径出错
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











