Apache mod_rewrite在.htaccess生效,如何在配置文件实现URL转$_REQUEST元素?
Apache虚拟主机配置迁移URL重写规则,实现多级路径转$_REQUEST参数
原.htaccess规则
原来在.htaccess中使用以下规则,将非文件、非目录的请求转发到index.php,让PHP可以解析多级路径(如example.com/s1/s2/s3)并填充到$_REQUEST数组:
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php [NC,L,QSA]
当前Apache虚拟主机配置
迁移到Apache虚拟主机配置文件中的规则如下:
<IfModule mod_ssl.c> <VirtualHost *:443> DocumentRoot "/home/...path.../public" ServerName example.com Alias /lib /home/...path.../otherlib/ <Directory /> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> RewriteEngine on RewriteCond %{REQUEST_URI} !^/lib/ [NC] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php [NC,L,QSA] </VirtualHost> </IfModule>
配置修正与验证要点
- 缩小目录配置范围:当前
<Directory />配置过于宽泛,建议限定到网站根目录以降低安全风险:<Directory "/home/...path.../public"> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> - 确保PHP获取路径信息:如果PHP代码依赖
PATH_INFO解析路径段,需在虚拟主机配置中添加参数开启传递:<FilesMatch "\.php$"> SetHandler application/x-httpd-php AcceptPathInfo On </FilesMatch> - 规则一致性验证:虚拟主机级别的重写规则与
.htaccess行为一致,^(.*)$匹配所有非/lib/、非文件非目录的请求,QSA参数会保留原查询字符串,确保$_REQUEST同时获取路径参数和查询参数。
修改配置后重启Apache服务,访问example.com/s1/s2/s3,PHP即可通过$_SERVER['REQUEST_URI']或$_SERVER['PATH_INFO']提取路径段并填充到$_REQUEST数组,实现原.htaccess的功能。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

