2011-07-20 103 views
2

我一直在搜索整个网络,并且还没有找到任何解决此问题的方法。我希望你能对这种情况有所了解。使用.htaccess隐藏URL关键参数

我有我的索引文件中设定了这样的:

<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评级)。

我该如何将该URL改写为/users/profile/5


编辑: 我试过以下,导致HTTP 500:

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

编辑:我的.htaccess文件,直接位于根文件夹中:http://pastie.org/2268239
线338是我想要达到的目标(现在只是一个评论)。

+0

Apache的错误日志说错误500的原因是什么? – LazyOne

+0

@LazyOne由于可能的配置错误,请求超出了10个内部重定向的限制。 – zykadelic

+0

这意味着你的规则(如果它只有一个;如果更多 - 那么它们的组合)会创建无限的重写周期,Apache必须强行中止。你必须添加能够打破这种循环的条件(例如,在你的规则之前添加'RewriteCond%{REQUEST_FILENAME}!-f'),但这只是一个疯狂的猜测,因为我不知道所有细节)。如果这不起作用 - 那么我强烈建议启用重写调试('RewriteLogLevel 9')并检查重写日志以查看导致它的规则。否则提供更多的细节(你当前的htaccess,它的位置等)。 – LazyOne

回答

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

简单的答案为您的情况下,将在您的.htaccess文件

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

这增加,这将站点上的所有流量重定向到您的index.php文件。

然后,您可以决定如何使用$ _SERVER [“REQUEST_URI”]

+0

我将第三行的一部分修改为“/index.php?p=$1”,因为我认为这就是您的意思?但是,这使我的主页(空白URI)和404页面(直接位于根文件夹内)不断重定向到自身。此外,我的外部文件(图像,样式表,JavaScript)不会加载。 – zykadelic

1

的URI在你的脚本做我不是一个PHP的人,但我想这与我的重写。

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

在这种情况下,为p参数,你要找的所有字符直到最后一个斜线,所以这第一部分需要什么,否则它会停在第一个斜杠(用户,而不是的用户/配置文件)。

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

然后发生在我身上的最后一部分不需要避免斜杠。由于第一部分是贪婪的,明确的/斜线将成为最后的斜杠。因此,它是更简单:

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

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

这些规则确实希望所有的URL都采用这种格式,这就是你所要求的。但也许它有点过于琐碎,所以它可能会排除真正具有.htm或.php或其他内容的网址。

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

此查找任何直到最后一个斜杠,然后任何没有点的东西。如果它有一个点,这不适用。因此,如果它是一个“常规”网址,这将使它无法使用。这可能有助于解决404问题,以防404页面被这个问题困扰。

+0

我试过了你的补充,他们都没有对行为做任何改变。 – zykadelic

+0

修改为尝试使用“更严格”的规则,以便仅保留常规网址。也许这个404页面被抓住了。注意这些都是'[L]'最后的规则 - 不是重定向。此外,在测试时,尝试使用不同的网址,例如,最后增加数字 - 我在使用谷歌浏览器时遇到了问题,它缓存了我之前的重定向/重写,而没有获取新的网址。 – goodeye