我非常喜欢这个URL重写。我的脑子里只有一个问题。
www.example.com/?page_name=home
$ _GET ['page_name']实际上是家
在URL重写后,网址变为
www.example.com/home
PHP仍然可以获得$ _GET ['page_name']是'home'??
由于
答案 0 :(得分:2)
URL重写由 Web服务器完成,假设在这种情况下是Apache。这与PHP不同。
Apache收到对URL www.example.com/home
的请求。现在需要弄清楚如何处理这个请求。它将检查其配置是否与www.example.com
匹配,这将指向文档根,即硬盘上的某个文件夹。它检查硬盘上的该文件夹并遇到.htaccess文件。它会评估.htaccess文件,该文件告诉它重写从/home
到?page_name=home
的网址。
Apache现在试图找出如何处理?page_name=home
。由于没有给出文件名,因此默认为index.php
(希望存在)。它现在在文档根目录中运行index.php
文件,并将其作为已收到的URL传递给它?page_name=home
。 PHP从那里接受它,忘记了发生的重写。对于PHP,您似乎已收到参数page_name
作为查询参数,并将其放入$_GET
。
答案 1 :(得分:1)
这取决于重写规则,但是,您可以按预期工作。
以下重写规则:
RewriteRule /home /index.php?page_name=home
只会导致请求/ home执行index.php,$_GET['page_name']
等于“home”。
但是,根据网站的复杂程度,最好使用更通用的重写规则,例如:
RewriteRule ^(.+)$ index.php/$1
然后你会查询$ _SERVER ['PATH_INFO']以查看它是否包含“home”。这将与可能传入的其他$ _GET参数很好地配合使用。
答案 2 :(得分: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
,其价值为{{1}}。