如何通过Apache Mod Rewrite及Nginx配置实现PHP REST API的优雅URL路由
实现Apache和Nginx的URL重写适配你的PHP REST API
完全可以实现你要的效果!不管是Apache还是Nginx,都能通过简单配置让你的动态URL直接被PHP解析,不用手动在URL里加index.php。下面分两种服务器给你具体配置方案:
Apache 配置步骤
首先得确保你的Apache已经启用了mod_rewrite模块(大部分VPS默认已经开启,如果没开的话,Ubuntu/Debian可以用sudo a2enmod rewrite,CentOS可以编辑httpd.conf开启)。
然后在你的api目录下创建一个.htaccess文件,写入以下规则:
RewriteEngine On # 如果请求的不是真实文件或目录,就执行重写 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]
规则说明:
RewriteEngine On:开启URL重写功能- 两个
RewriteCond:判断当前请求的路径是不是真实存在的文件(!-f)或目录(!-d),只有当都不是的时候才执行重写 RewriteRule ^(.*)$ index.php/$1 [L]:把请求的路径(比如user/create)追加到index.php后面,[L]表示这是最后一条规则,停止后续匹配
另外要注意:你的Apache站点配置里,对应/api目录的AllowOverride要设置为All,不然.htaccess的规则不会生效。比如在虚拟主机配置里加:
<Directory /var/www/html/api> AllowOverride All </Directory>
关于URL参数:不用担心,Apache会自动保留原请求的查询参数(比如?user=test),不需要额外配置,重写后的请求会自动带上这些参数。
Nginx 配置步骤
Nginx的配置更直接,不需要.htaccess,直接在你的站点配置的server块里添加以下location规则:
location /api/ { # 先尝试访问真实文件/目录,不存在就转发到index.php try_files $uri $uri/ /api/index.php$request_uri; } # 确保PHP解析配置正确(如果你的Nginx已经有PHP处理规则,这部分可以调整适配) location ~ \.php$ { fastcgi_pass unix:/run/php/php8.2-fpm.sock; # 这里根据你的PHP版本和fpm路径调整 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; # 关键:确保PHP能拿到完整的请求URI fastcgi_param REQUEST_URI $request_uri; }
规则说明:
try_files $uri $uri/ /api/index.php$request_uri:先检查请求的路径是不是真实文件/目录,不是的话就把整个请求URI(包括路径和参数)转发到/api/index.php- 后面的PHP处理块里,
fastcgi_param REQUEST_URI $request_uri是关键,确保你的PHP代码能通过$_SERVER['REQUEST_URI']拿到正确的请求路径,和你本地开发时的逻辑一致
同样,参数会自动保留,比如访问beautifulrest.com/api/user/create?user=test会被正确转发到/api/index.php/user/create?user=test,你的PHP解析逻辑完全不用改。
内容的提问来源于stack exchange,提问作者Rom7x
相关产品推荐
相关产品推荐

