问题创建“自定义”用户URL

时间:2010-08-23 16:13:27

标签: php mysql url url-routing

我遇到了以下问题:

我们的会员希望以http://www.example.com/membername的形式直接从我们的主域名中获取个性化网站。我正在以两种方式看待可能的解决方案,但两者都不理想(将在下面解释)。

方法1 - ?Member=

在此方法中,我只创建一个自定义URL并将信息存储在成员的数据库配置文件中。例如:如果我希望我的“自定义”网址为jm4,供消费者访问我的网站,则必须输入http://www.example.com?Member=jm4

当然,该网站会$_GET['Member']查找会员信息,从索引页面将主要数据存储在会话中,然后重定向到主页。消费者不再在URL中看到成员名称,而是看到www.example.com的所有页面名称,就好像他们只是访问了父域一样(但每个成员的页面都有自定义信息)。

虽然这种方法有效但却存在以下问题:

  • 网址不像/jm4那么简单 输入的任何错误 将导致通配符?Members= 页面错误。此外,这种方法保持不变 那个特定成员的信息 在会议中(这是必要的 在页面上浏览页面 特定成员域)和 阻止某人简单地打字 http://www.example.com?Member=name2来 访问另一个站点而不清除 他们的会话或关闭浏览器。

方法2 - /membername

虽然是首选方法,但目前我们知道如何创建的唯一方法是在子文件夹中手动生成索引文件,重定向到主索引,然后允许使用者查看该成员的个人网站。

例如,如果我访问www.example.com/jm4,我就会点击包含 index.php /jm4文件夹。在此文件中只包含:

<?php
session_start();
ob_start();

$_SESSION['AgentNumber'] = "779562";
header("Location: ../index.php");
exit;
?>

主索引通过以下方式识别:

<?php
session_start();
ob_start();

if ($_SESSION['MemberNumber'] == NULL) {
     header("Location:ac/");
     exit;
}

$conn = mysql_connect("localhost", "USER", "PW");
mysql_select_db("DB",$conn);

$sql = "SELECT * FROM table WHERE MemberNumber = $_SESSION[MemberNumber]";
$result = mysql_query($sql, $conn) or die(mysql_error());
while ($newArray = mysql_fetch_array($result)) {
    $_SESSION['MemberName'] = $newArray['MemberName'];
    $_SESSION['MemberPhone'] = $newArray['MemberPhone'];
    $_SESSION['MemberMobile'] = $newArray['MemberMobile'];
    $_SESSION['MemberFax'] = $newArray['MemberFax'];
    $_SESSION['MemberEmail'] = $newArray['MemberEmail'];
    $_SESSION['MemberAddress'] = $newArray['MemberAddress'];
    $_SESSION['MemberCity'] = $newArray['MemberCity'];
    $_SESSION['MemberState'] = $newArray['MemberState'];
    $_SESSION['MemberZip'] = $newArray['MemberZip'];
    $_SESSION['MemberAltName'] = $newArray['MemberAltName'];
}
mysql_close($conn);
header("Location: home/");
exit;
?>

对于会员来说,我们当然更愿意使用第二种方法“轻松”,但仍然遇到以下问题:

  1. 我们被迫手动创建一个 子文件夹和唯一的index.php文件 对于我们在船上的每个新成员
  2. 虽然上面可能是 自动化(当新成员创建时 配置文件,自动生成php 文件和文件夹)但更多 复杂,我们不想 在主要文件上有3000个子文件夹 域。
  3. 有没有人遇到过类似的问题?如果是这样,你是如何解决它的?根据我上面的详细信息,您会推荐什么?任何建议都表示赞赏。

    此外 - 使用子域(membername.example.com)不是首选,因为我们当前的SSL不允许使用通配符。

    编辑1 - 现有.HTACCESS文件 我在网站上现有的.htaccess文件如下所示:

    ErrorDocument 404 /404.php
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^(.*)$ $1.php [L]
    RewriteRule ^(.*)$ /?Member=$1 [L]
    

3 个答案:

答案 0 :(得分:3)

您可以通过在根目录中的.htaccess添加一些行来执行首选方法:

This site should get you startedthis one

答案 1 :(得分:2)

如果您使用的是apache,那么您可以使用mod_rewrite将http://host/membername之类的网址更改为http://host/memberpage.php?name=membername

答案 2 :(得分:2)

您可以在.htaccess文件中使用它作为第二种方法。它会将http://yoursite.com/membername重写为http://yoursite.com/?Member=membername

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /?Member=$1 [L]
</IfModule>