如何使用htaccess获得SEO友好的URL


How do I get SEO friendly URLs with htaccess?

尝试为项目构建自己的社交媒体。我在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(特殊用户url)正在工作,但如果用户没有点,则不会工作,比如mysite.com/myuser。然后它试图获取不存在的myuser.php。此外,当我从"my.user"(如:mysite.com/20)中输入"id"时,它只显示"找不到个人资料",因此会发生一些事情。

这是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();
}

致以最良好的问候,埃里克。

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

更改

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

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

因此该规则只能匹配现有的php文件。