0

我很不喜欢这个 URL 重写。我脑子里有个问题。

www.example.com/?page_name=home

$_GET['page_name'] 实际上是 home

URL 重写后 url 变为

www.example.com/home

PHP 仍然可以得到 $_GET['page_name'] 是 'home' 吗?

谢谢

4

3 回答 3

2

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.

于 2012-05-22T06:36:08.137 回答
1

尝试使用这样的重写(根据需要进行更改):

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

于 2012-05-22T06:42:48.113 回答
1

这取决于重写规则,但是是的,您可以让它按预期工作。

以下重写规则:

RewriteRule /home /index.php?page_name=home

只会导致对 /home 的请求以$_GET['page_name']等于“home”的方式执行 index.php。

但是,根据您网站的复杂性,最好使用更通用的重写规则,例如:

RewriteRule ^(.+)$ index.php/$1

然后您将查询 $_SERVER['PATH_INFO'] 以查看它是否包含“home”。这将与可能传入的其他 $_GET 参数很好地配合。

于 2012-05-22T06:38:52.877 回答