2015-04-28 105 views
0

可能我的问题与其他标题重复,但我已经阅读了太多的标题,并与谷歌多次检查。所以如果它重复,我很抱歉。Apache的URL重写规则和正则表达式

现在我有一个网址:

www.mysite.com/profile.php 

我使用这个URL重写规则:

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

而且我可以改变我的网址,如:

www.mysite.com/username 

然后,我需要更新我的网址与其他获取参数:

www.mysite.com/username/photos 

在这个部分,我有一个像网址:

www.mysite.com/profile.php?username=xxx&w=photo 

我已经试过这个URL规则的URL上面:

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] 

回答

1

第一件事第一:

[A-Za-z0-9-_] 

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

正确的规则将是:

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] 
+0

你能否再次检查我的问题与我的更新。 – Mehmet

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] 
+0

它的工作,但我又有一个问题。当第二个get参数为null时,此规则不起作用。我想同时使用** mysite.com /用户名**和** mysite.com /用户名/详细信息**。那么我应该有多少规则? – Mehmet

+0

@Mehmet只是使用这两个条件。看我的编辑。 – Peter

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参数,看看它是否是空的。如果不是,则也显示细节。