htaccess mod_rewrite:简化URL

时间:2014-12-30 01:59:07

标签: apache .htaccess mod-rewrite

我在下面的重写时遇到了麻烦。我确定mod_rewrite已启用但不确定我哪里出错了。

我尝试更改以下模式:

/profile/?userid=157&username=FirstL

为:

/profile/FirstL

我尝试了很多不同的规则,但我觉得最接近正确的两个规则根本就没有。我目前的失败如下:

RewriteEngine On
RewriteCond %{THE_REQUEST} \ /profile/+\?userid=$([^&\ ]+)&username=$([^&\ ]+)
RewriteRule ^ /%1? [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ /profile/?userid=$1&username=$2 [L,QSA]

RewriteEngine On
RewriteRule ^([^/]*)$ /profile/?userid=$1&username=$2 [L]

完整的htaccess:

    Options +FollowSymLinks -Multiviews

    RewriteEngine On
    RewriteCond %{THE_REQUEST} \ /profile/+\?userid=$([^&\ ]+)&username=$([^&\ ]+)
    RewriteRule ^ /profile/%1/%2? [L,R=301]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^profile/([^/]+)/([^/]+)$ /profile/?userid=$1&username=$2 [L,QSA]

    RewriteBase /

    DirectorySlash Off

    RewriteRule ^admin$ /admin/index.php [L,E=LOOP:1]

    RewriteCond %{ENV:REDIRECT_LOOP} !1
    RewriteRule ^admin/index.php$ /admin [R=301,L]

    # remove .php
    RewriteCond %{THE_REQUEST} ^GET\ (.*)\.php\ HTTP
    RewriteRule (.*)\.php$ $1 [R=301]

    # remove index
    RewriteRule (.*)/index$ $1/ [R=301]

    # remove slash if not directory
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} /$
    RewriteRule (.*)/ $1 [R=301]

    # add .php to access file, but don't redirect
    RewriteCond %{REQUEST_FILENAME}.php -f
    RewriteCond %{REQUEST_URI} !/$
    RewriteRule (.*) $1\.php [L]

    #Force non-www:
    RewriteCond %{HTTP_HOST} www.(.*)$ [NC]
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

1 个答案:

答案 0 :(得分:1)

您丢失了网址的userID部分,因此当您尝试在内部重写该网址时,那里什么都没有:

RewriteRule ^([^/]+)$ /profile/?userid=$1&username=$2 [L,QSA]

此规则表示第一场比赛是" userid"并且第二个匹配是"用户名",并且您只有一个匹配,并且除此之外,它甚至不以" profile"开头。

您需要在网址中的某处包含用户ID,否则无法提取它。

RewriteEngine On
RewriteCond %{THE_REQUEST} \ /profile/+\?userid=([^&\ ]+)&username=([^&\ ]+)
RewriteRule ^ /profile/%1/%2? [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^profile/([^/]+)/([^/]+)$ /profile/?userid=$1&username=$2 [L,QSA]