我很不喜欢这个 URL 重写。我脑子里有个问题。
www.example.com/?page_name=home
$_GET['page_name'] 实际上是 home
URL 重写后 url 变为
www.example.com/home
PHP 仍然可以得到 $_GET['page_name'] 是 'home' 吗?
谢谢
我很不喜欢这个 URL 重写。我脑子里有个问题。
www.example.com/?page_name=home
$_GET['page_name'] 实际上是 home
URL 重写后 url 变为
www.example.com/home
PHP 仍然可以得到 $_GET['page_name'] 是 'home' 吗?
谢谢
URL 重写由Web 服务器完成,在这种情况下是 Apache。这与 PHP 不同。
Apache 收到对 URL 的请求www.example.com/home
。它现在需要弄清楚如何处理这个请求。它将检查其配置是否匹配www.example.com
,这会将其指向文档根目录,即硬盘上的某个文件夹。它检查硬盘上的那个文件夹并遇到一个 .htaccess 文件。它评估 .htaccess 文件,该文件告诉它将URL 从重写/home
为?page_name=home
。
Apache 现在试图弄清楚如何处理?page_name=home
. 由于没有给出文件名,它默认为index.php
(希望存在)。它现在index.php
在文档根目录中运行该文件,并将其?page_name=home
作为接收到的 URL 传递。PHP 从那里获取它,忘记了发生的重写。对于 PHP,您似乎已将参数page_name
作为查询参数接收并将其放入$_GET
.
尝试使用这样的重写(根据需要进行更改):
RewriteRule ^([A-Za-Z0-9-_]+)/?$ index.php?page_name=$1 [L]
以上规则重定向
http://www.domain.com/string_LiKe-this53/
在真实的现有页面上
http://www.domain.com/index.php?page=string_LiKe-this53
您可以在其上使用您的$_GET['page']
,这将具有价值string_LiKe-this53
。
这取决于重写规则,但是是的,您可以让它按预期工作。
以下重写规则:
RewriteRule /home /index.php?page_name=home
只会导致对 /home 的请求以$_GET['page_name']
等于“home”的方式执行 index.php。
但是,根据您网站的复杂性,最好使用更通用的重写规则,例如:
RewriteRule ^(.+)$ index.php/$1
然后您将查询 $_SERVER['PATH_INFO'] 以查看它是否包含“home”。这将与可能传入的其他 $_GET 参数很好地配合。