如何使用htaccess获取SEO友好URL?

时间:2016-04-11 14:33:57

标签: php .htaccess redirect

尝试为项目构建自己的社交媒体。 我在profile.php上有一个php脚本,它在用户数据库中查询“id”或自定义“/my.user”url。 当我在url中输入它时,我希望它像:mysite.com/my.user它使用此代码:

RewriteRule ^/?(.+)/?$ ./profile.php?u=$1 [QSA,L]

但是htaccess不允许我输入配置文件的“id”,所以mysite.com/20例如不起作用。 我尝试了另一个htaccess代码,但其工作方式与上面相同:

RewriteRule ^/?([a-zA-Z0-9\-=&_@\.]+)/?$ profile.php?u=$1 [QSA,L]

所以要清理一下;

  • 这适用于:mysite.com/my.user
  • 这不是:mysite.com/20或mysite.com/myuser

我希望能够解决这个问题:

  • mysite.com/20
  • mysite.com/my.user

我该怎么办?

完整.htaccess代码:

AddDefaultCharset UTF-8

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

Options +FollowSymLinks

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^./profile.php


RewriteRule ^/?(.+)/?$ ./profile.php?u=$1 [QSA,L]

<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file .(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>

现在发生的事情是mysite.com/my.user(特殊用户网址)正在运行,但如果用户没有点,例如mysite.com/myuser,则不行。然后它尝试获取不存在的myuser.php。 此外,当我从“my.user”输入“id”时,例如:mysite.com/20,它只是说“找不到个人资料”,所以会发生一些事情。

这是profile.php查询代码:

$profile = mysqli_real_escape_string($mysqli, $_GET['u']);
if (filter_var($profile, FILTER_VALIDATE_INT) == true) {
    $query = "SELECT * FROM UserProfile, Location WHERE UserProfile.id = '$profile' AND Location.id = '$profile'";
} else {
    $queryurl = "SELECT id FROM UserProfile WHERE UserProfile.ProfileUrl = '$profile'";
    if ($result2 = $mysqli->query($queryurl)) {
        while ($row2 = $result2->fetch_assoc()) {
            $userid = $row2['id'];
        }
    }
    $query = "SELECT * FROM UserProfile, Location WHERE UserProfile.ProfileUrl = '$profile' AND Location.id = '$userid'";
    $result2->free();
}

最好的问候,Erik。

1 个答案:

答案 0 :(得分:0)

发生的事情是你的第一条规则匹配任何不存在的uri并将其重写为/uri.php,这样你的第二条规则永远不会被触发。

更改

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^.]+)$ $1.php [NC,L]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^.]+)$ $1.php [NC,L]

所以规则只能匹配现有的php文件。