htaccess RewriteRule return 空 $_GET
htacces RewriteRule return empty $_GET
我的重写规则:
RewriteEngine On
RewriteRule ^popup/(.+)/$ /popup.php?name= [L,QSA]
在本地它工作正常,在 $_GET 中我得到具有预期值的变量 "name"。但它不适用于生产服务器。我的 $_GET 是空的,但服务器在 popup.php 脚本上重定向我。
编辑1:
var_dump 的 $_SERVER 在 popup.php:
上有效
SERVER_SOFTWARE => Apache/2.2.15 (CentOS)
SERVER_ADDR => 127.0.0.1
SERVER_PORT => 80
REMOTE_ADDR => 127.0.0.1
DOCUMENT_ROOT => /var/www/site.dom/htdocs
SERVER_ADMIN => root@localhost
SCRIPT_FILENAME => /var/www/site.dom/htdocs/popup.php
REMOTE_PORT => 60763
GATEWAY_INTERFACE => CGI/1.1
SERVER_PROTOCOL => HTTP/1.0
REQUEST_METHOD => GET
QUERY_STRING =>
REQUEST_URI => /popup/work/
SCRIPT_NAME => /popup.php
PATH_INFO => /work/
PATH_TRANSLATED => redirect:/parse_request.php/
PHP_SELF => /popup.php/work/
PATH_TRANSLATED 是什么意思?
这是因为您的网络服务器上的选项 MultiViews
。在 .htaccess 顶部添加此行以禁用它:
Options -MultiViews
选项 MultiViews
由 Apache's content negotiation module
使用,它在 mod_rewrite
之前运行并使 Apache 服务器匹配文件扩展名。所以 /file
可以在 URL 中,但它将服务于 /file.php
从而取代你的重写规则。
我的重写规则:
RewriteEngine On
RewriteRule ^popup/(.+)/$ /popup.php?name= [L,QSA]
在本地它工作正常,在 $_GET 中我得到具有预期值的变量 "name"。但它不适用于生产服务器。我的 $_GET 是空的,但服务器在 popup.php 脚本上重定向我。
编辑1: var_dump 的 $_SERVER 在 popup.php:
上有效SERVER_SOFTWARE => Apache/2.2.15 (CentOS)
SERVER_ADDR => 127.0.0.1
SERVER_PORT => 80
REMOTE_ADDR => 127.0.0.1
DOCUMENT_ROOT => /var/www/site.dom/htdocs
SERVER_ADMIN => root@localhost
SCRIPT_FILENAME => /var/www/site.dom/htdocs/popup.php
REMOTE_PORT => 60763
GATEWAY_INTERFACE => CGI/1.1
SERVER_PROTOCOL => HTTP/1.0
REQUEST_METHOD => GET
QUERY_STRING =>
REQUEST_URI => /popup/work/
SCRIPT_NAME => /popup.php
PATH_INFO => /work/
PATH_TRANSLATED => redirect:/parse_request.php/
PHP_SELF => /popup.php/work/
PATH_TRANSLATED 是什么意思?
这是因为您的网络服务器上的选项 MultiViews
。在 .htaccess 顶部添加此行以禁用它:
Options -MultiViews
选项 MultiViews
由 Apache's content negotiation module
使用,它在 mod_rewrite
之前运行并使 Apache 服务器匹配文件扩展名。所以 /file
可以在 URL 中,但它将服务于 /file.php
从而取代你的重写规则。