重写规则无效或正确呈现页面

时间:2016-02-05 14:25:40

标签: php apache .htaccess mod-rewrite url-rewriting

我正在建立一个拥有众多用户的社交网站。因此,我需要一种更简单,更简单的方法来访问任何用户页面。假设我以Freddy身份登录,如果我转到Freddy的个人资料页面,该网址会说:http://localhost/profile_page.php。如果从此页面开始,我想转到Alice的个人资料页面,我只需修改网址并输入http://localhost/profile_page.php/alice,而不是写http://localhost/profile_page.php?u=alice

我创建了一个.htaccess文件,我已经从Wamp中的Apache模块启用了rewrite_module。但是,页面未正确加载。再次,假设我以Freddy身份登录,配置文件页面加载完美,但是当我编辑url去另一个用户页面时,即http://localhost/profile_page.php/Alice(谁是真实用户,所以我希望它转到Alice的个人资料页面),它不会按照CSS的指示呈现页面,也会保留在Freddy的个人资料页面上。

的.htaccess

RewriteBase /www/
RewriteEngine On

RewriteRule ^([a-zA-Z0-9_-]+)$ profile.php?u=$1
RewriteRule ^([a-zA-Z0-9_-]+)/$ profile.php?u=$1

1 个答案:

答案 0 :(得分:1)

好吧,你的规则不考虑这里的php文件(检查我是否在规则中的所有regexp之前添加了斜杠):

RewriteBase /www/
RewriteEngine On

RewriteRule ^/([a-zA-Z0-9_-]+)$ profile.php?u=$1
RewriteRule ^/([a-zA-Z0-9_-]+)/$ profile.php?u=$1

使用这段代码,http://localhost/profile_page.php?u=alice永远不会匹配。 ^([a-zA-Z0-9_-]+)/$仅匹配字母,数字和下划线,因此例如问号无法匹配。

试试这个(假设不是profile.php,而是指profile_page.php

RewriteBase /www/
RewriteEngine On

RewriteRule ^/profile_page.php/([a-zA-Z0-9_-]+)$ profile_page.php?u=$1
RewriteRule ^/profile_page.php/([a-zA-Z0-9_-]+)/$ profile_page.php?u=$1

另一项改进。您只能在一个表达式中设置两个表达式。

RewriteBase /www/
RewriteEngine On

RewriteRule ^profile_page.php/([a-zA-Z0-9_-]+)/?$ profile_page.php?u=$1

我强烈建议你在这里删除profile_page.php以增加网址的可读性(我知道你的格式可能在你的规范中)。

RewriteBase /www/
RewriteEngine On

RewriteRule ^/profile_page.php/([a-zA-Z0-9_-]+)/?$ profile_page.php?u=$1
RewriteRule ^/profile/([a-zA-Z0-9_-]+)/?$ profile_page.php?u=$1
RewriteRule ^/([a-zA-Z0-9_-]+)/?$ profile_page.php?u=$1

在这种情况下,您将能够匹配这些网址 * http://localhost.com/alice * http://localhost:com/profile/alice * http://localhost.com/profile_page.php/alice

为了能够匹配您自己的个人资料,请确保您也启用了一些路线,例如:

RewriteBase /www/
RewriteEngine On

RewriteRule ^/?$ profile_page.php
RewriteRule ^/me?$ profile_page.php
RewriteRule ^/profile_page.php/([a-zA-Z0-9_-]+)/?$ profile_page.php?u=$1
RewriteRule ^/profile/([a-zA-Z0-9_-]+)/?$ profile_page.php?u=$1
RewriteRule ^/([a-zA-Z0-9_-]+)/?$ profile_page.php?u=$1

检查订单是否重要。第一个匹配,第一个应用。在那种情况下,我使用了相同的端点文件。检查$ _GET [' u']是否已设置为加载指定用户或会话中的用户。

我强烈建议您使用某种前端控制器,以便能够管理给定一个类(例如app.php)的所有路由,例如Symfony或任何现代PHP框架。