使用mod_rewrite模拟Facebook样式的URL

时间:2012-09-14 10:00:48

标签: php .htaccess mod-rewrite

我希望地址栏显示:

http://facebook.com/user

http://facebook.com/user/ -> http://facebook.com/user

http://facebook.com/user/photos -> http://facebook.com/user/photos

我的重写规则:

RewriteEngine On
RewriteRule ^(.+)/$ $1 [NC]
RewriteRule ^([A-Za-z0-9_-]+)/?([A-Za-z0-9_-]*)$ user.php?id=$1&second=$2 [NC,L]

会发生什么:

1). http://domain.com/user (working well)

2). http://domain.com/user/ (keeps the / in the address bar and destroys css/js/img paths)

3). http://domain.com/user/photos (same result as 2, correct except the paths)

如果我使用<base href="...">强制页面正确显示的路径。但我想在没有它的情况下解决我的问题。

如何删除地址栏中的尾部斜杠?重写似乎与预期的一样。

2 个答案:

答案 0 :(得分:1)

您的问题是,当您有人访问http://domain.com/user/photos时,页面中的css,js和其他相关链接会解析为http://domain.com/user/css/main.css(例如)。

您有两个解决方案:

  • 在页面的头部添加基本标记(您已尝试过)
  • 更改页面绝对链接中的所有相关链接(我不建议你)

因此,更简单的解决方案是使用基本标记。

注意:即使您最后删除了斜杠,它也可能适用于http://domain.com/user/但绝对不适用于http://domain.com/user/photos

答案 1 :(得分:1)

当您打算使用友好URL时,必须使用资源的绝对路径。

初步声明

您可能已经用这种方式声明了index.php

<link rel="stylesheet" href="stylesheets/styles.css" />
<img src="assets/user.png" />
<script type="text/javascript" src="scripts/home.js"></script>

使用/获取绝对路径

的方法

但必须以这种方式进行翻译:

<link rel="stylesheet" href="/stylesheets/styles.css" />
<img src="/assets/user.png" />
<script type="text/javascript" src="/scripts/home.js"></script>

请注意前面的/,使其成为绝对网址。

使用<base href="/" />

如果这对您来说是一项繁琐的工作,您可以使用此标记:

<base href="/" />

这将使您的相对URL与Root相关联。

使用$baseurl变量

另一种更好的方法是使用$baseurl变量作为前缀。

<link rel="stylesheet" href="<?php echo $baseurl; ?>/stylesheets/styles.css" />
<img src="<?php echo $baseurl; ?>/assets/user.png" />
<script type="text/javascript" src="<?php echo $baseurl; ?>/scripts/home.js"></script>

这样,如果您在一个文件夹中而不是在根目录中托管,您甚至可以更改$baseurl值。