所以基本上我有一个包含用户个人资料的网站。我希望用户能够查询这样的配置文件: www.example.com/john
这将触发我用PHP编写的另一个页面来显示该配置文件,但没有更改网址。我已经看过SO上的其他例子了: How do I achieve a url like www.example.com/username to redirect to www.example.com/user/profile.php?uid=10?
然而,这使用url重写,这意味着URL会随之改变。对于instnace,如果页面名为users.php,我不希望发生这种情况: 用户查询www.examples.com/john - >页面已更改为www.examples.com/users.php?name=John
我希望网址保留为www.examples.com/john,但服务器需要提供www.examples.com/users.php?name=John
即使我不想在网址栏中更改网址,我仍然会使用网址重写来实现这一目标吗?希望有人能提供帮助,谢谢!
答案 0 :(得分:1)
通常谁需要这种功能使用路由器。
路由是获取URI端点(位于基本URL之后的URI的一部分)并将其分解为参数以确定该控制器的哪个模块,控制器和操作应该接收请求的过程。
基本上你可以把你的网址划分为参数。它与输入网址的响应。 php中有一些很好的库可以让你处理路由器,例如:
在phroute中,您可以通过以下方式解决问题:
$router->get(['/user/{name}', 'username'], function($name){
//retrieve $name information
return 'Hello ' . $name;
})
仅供参考,每个MVC框架都使用路由器作为标准。
答案 1 :(得分:0)
使用.htaccess文件
RewriteEngine on
RewriteRule ^/([a-zA-Z0-9])$ /users.php?name=$1
我希望这会解决您的问题,现在它会做什么,在前面或公共网址上就像http://www.example.com/john
但服务器上的users.php
脚本将收到一个GET参数名称有值约翰。
确保打开apache mod_rewrite。
答案 2 :(得分:0)
使用Apache的重写模块,您可以进行重写或重定向。
重定向意味着,向客户端发送响应(状态代码301,302)并要求获取另一个URL。这会导致浏览器的URL栏更改为新URL。当您将R|redirect
标志添加到规则时,例如
RewriteRule ^foo$ /bar.html [R,L]
或目标是包含域的绝对URL,例如
RewriteRule ^foo$ http://www.example.com/bar.html [L]
另一方面重写,意味着接受请求并以某种方式发送答案,而不将客户端重定向到另一个资源。
RewriteRule ^foo$ /bar.html [L]
这次,客户端要求foo
,但是服务器在不告知客户端的情况下发送bar.html
的内容。
因此,只要您不添加R
标志或提供绝对URL,客户端的URL栏就不会改变,例如。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^john$ /users.php?name=john [L]
或更一般
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ /users.php?name=$1 [L]