使用.htaccess隐藏URL密钥参数

时间:2011-07-20 20:59:31

标签: php .htaccess url parameters url-rewriting

我一直在网上搜索,还没有找到解决这个问题的方法。我希望你能对这种情况有所了解。

我的索引文件设置如下:

<header></header>
<div id="main">
    <?php
    if(isset($_GET["p"])) $p = $_GET["p"];
    else $p = "home";

    if(file_exists("pages/{$p}.php")) include("pages/{$p}.php");
    ?>
</div>

这使我使用?p=contact href加载我的页面。

说我想显示用户个人资料。然后我在“pages”文件夹中创建一个子文件夹,创建相对路径pages/users/profile.php,从而创建href ?p=users/profile&uid=5。但这留下了一个丑陋的URL(以及SEO评级)。

如何将该网址重写为/users/profile/5


修改 我尝试了以下内容,产生了HTTP 500:

RewriteRule ^([^/]*)/([^/]*)$ /?p=$1&uid=$2 [L]

编辑:我的.htaccess文件,直接位于根文件夹中:http://pastie.org/2268239
第338行是我想要实现的目标(目前只是评论)。

3 个答案:

答案 0 :(得分:2)

对于您的情况,最简单的答案是将其添加到.htaccess文件中

RewriteEngine on
RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ /index.php?$1 [L]

这会将您网域上的所有流量重定向到index.php文件。

然后,您可以使用$ _SERVER [“REQUEST_URI”]中的uri确定脚本中的操作

答案 1 :(得分:2)

通过添加以下三行,我达到了预期的效果:

RewriteRule ^([a-zA-Z]+)$ index.php?p=$1 [L]
RewriteRule ^([a-zA-Z]+)/([a-zA-Z]+)$ index.php?p=$1/$2 [L]
RewriteRule ^([a-zA-Z]+)/([0-9]+)$ index.php?p=$1&uid=$2 [L]

这样我就可以访问/contact/users/index/users/profile/5

答案 2 :(得分:1)

我不是一个骗子的人,但我在重写时试过这个。

RewriteRule ^/(.+)/([^/]+)$ /index.php?p=$1&uid=$2 [L]

在这种情况下,对于p参数,你要查找到最后一个斜杠的所有字符,所以这的第一部分需要任何东西,否则它将停在第一个斜杠(用户改为用户/个人资料)。

然后它会查找斜杠并保持(不斜线)。 (.+)将是贪婪的,所以它会在结束前一直到最后一个斜杠。

然后我发现最后一部分不需要避免斜线。由于第一部分是贪婪的,因此显式/斜杠将成为最后一个斜杠。所以它更简单:

RewriteRule ^/(.+)/(.+)$ /index.php?p=$1&uid=$2 [L]

我喜欢.+要求一些东西,至少在第一次搞清楚这些时。如果稍后您知道它们可以是可选的,则可以.*,但通常最终会成为不同的页面或不同的规则。

这些规则确实希望所有网址都采用这种格式,这就是您所要求的。但也许它有点太抢,所以它可以排除真正有.htm或.php或其他什么的网址。

RewriteRule ^/(.+)/([^.]+)$ /index.php?p=$1&uid=$2 [L]

这会查找最后一个斜杠的内容,然后查找没有圆点的任何内容。如果它有一个点,这将不适用。因此,如果它是一个“常规”网址,这将使它不受影响。这可能有助于404问题,以防404页面被此捕获。