Apache URL重写规则和正则表达式

时间:2015-04-28 14:55:26

标签: regex apache .htaccess mod-rewrite

可能我的问题与另一个标题重复但是,我读了太多标题并且用google多次检查过。所以,如果它重复,我很抱歉。

现在我有一个网址:

www.mysite.com/profile.php

我正在使用此网址重写规则:

RewriteRule ^([A-Za-z0-9-_]+)/?$    profile.php?username=$1 [NC,L]

我可以改变我的网址:

www.mysite.com/username

然后,我需要使用其他get参数更新我的url:

www.mysite.com/username/photos

在这部分,我有一个像:

这样的网址
www.mysite.com/profile.php?username=xxx&w=photo

我已针对上面的网址尝试了此网址规则:

RewriteRule ^([A-Za-z0-9-_]+)/?$/?$    profile.php?username=$1&w=$2 [NC,L]

但它不起作用。请帮忙。

非常感谢。

------- ------ UPDATE

现在我可以使用它应该是的profile.php。但是其他重写规则被打破了。我当前的.htaccess文件是这样的:

RewriteEngine On

RewriteRule ^([\w-]+)/([\w-]+)/?$ profile.php?username=$1&w=$2 [QSA,L]
RewriteRule ^([\w-]+)/?$ profile.php?username=$1 [QSA,L]
RewriteRule ^p/timeline timeline.php [NC,L]
RewriteRule ^p/notifications notifications.php [NC,L]

3 个答案:

答案 0 :(得分:1)

第一件事:

[A-Za-z0-9-_]

不是正确的正则表达式,因为字符类中9_之间的非转义连字符充当十六进制39和十六进制5f之间的范围。要解决此问题,请确保在字符类的第一个或最后一个位置使用连字符。

正确的规则是:

RewriteRule ^([\w-]+)/([\w-]+)/?$ profile.php?username=$1&w=$2 [QSA,L]
RewriteRule ^([\w-]+)/?$ profile.php?username=$1 [QSA,L]

<强>更新

根据您更新的问题,请确保在特定规则后使用通用规则。所以你的规则是这样的:

RewriteRule ^p/(notifications|timeline)/?$ $1.php [NC,L]
RewriteRule ^([\w-]+)/([\w-]+)/?$ profile.php?username=$1&w=$2 [QSA,L]
RewriteRule ^([\w-]+)/?$ profile.php?username=$1 [QSA,L]

答案 1 :(得分:0)

RewriteRule ^([A-Za-z0-9-_]+)/(.+)$    profile.php?username=$1&w=$2 [NC,L]
RewriteRule ^([A-Za-z0-9-_]+)$    profile.php?username=$1 [NC,L]

答案 2 :(得分:0)

如果需要,您可以只有一条规则。我还会添加条件,以确保它不是真正的目录或文件。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([A-Za-z0-9-_]+)/?([A-Za-z0-9-_]+)?/?$ /profile.php?username=$1&w=$2 [NC,L]

在PHP中,您只需检查w参数,看它是否为空。如果不是,也显示详细信息。