mod_rewrite和已编入索引的页面

时间:2014-12-21 00:06:25

标签: apache .htaccess mod-rewrite search-engine

我有一个PHP页面,比方说/users/profile.php,我需要使网址更优雅,例如/users/123而不是/users/profile.php?id=123。 我定义了所需的规则,在/users/123上使用以下内容执行/users/profile.php?id=123

RewriteRule ^users/([0-9]+)$ /users/profile.php?id=$1 [L]

一切都很完美,但搜索引擎已经熟悉了/users/profile.php?id=123页面。 当他们要求/users/123时,如何引导他们或任何其他用户切换到/profile.php?id=123

为了确保,我需要这样做:

  1. 用户要求/profile.php?id=123
  2. 用户被重定向到/users/123,状态码为301
  3. 服务器执行/profile.php?id=123并将HTML返回给用户

3 个答案:

答案 0 :(得分:0)

RewriteCond %{QUERY_STRING} ^id\=(\d+)
RewriteRule ^users/profile\.php$ /users/%1 [R=301,L]

答案 1 :(得分:0)

您需要两条规则:

/users/profile.php?id=123外部重定向到/users/123

RewriteCond %{QUERY_STRING} ^id=([0-9]+)$
RewriteRule ^/users/profile\.php$ /user/%1 [R=307,L]

内部转发/user/123/users/profile.php

RewriteRule ^user/([0-9]+)$ /users/profile.php?id=$1 [L]

我将/users更改为/user,因为该网址描述的是单个用户。

(这些都来自内存,没有经过实际测试。但基本思路是第一条规则中的[R=307]标志。)

答案 2 :(得分:0)

.htaccess与:

一起使用
RewriteRule ^users/(\d+)/?$ /users/profile.php?id=$1 [L]
RewriteCond %{QUERY_STRING} ^id=(\d+)$
RewriteRule ^users/profile\.php$ /users/%1 [R=301,L]

为了避免循环,我会更改通常没有人需要知道的页面名称(profile.php - > profileNEW.php)