Apache的URL重写规则和正则表达式
问题描述:
可能我的问题与其他标题重复,但我已经阅读了太多的标题,并与谷歌多次检查。所以如果它重复,我很抱歉。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]
答
第一件事第一:
[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]
答
你只需有一个规则,如果你想要的。我还会添加条件,以确保它不是真正的目录或文件。
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
参数,看看它是否是空的。如果不是,则也显示细节。
你能否再次检查我的问题与我的更新。 – Mehmet