【问题标题】:Apache URL rewrite rule and regexApache URL 重写规则和正则表达式
【发布时间】:2015-04-28 14:55:25
【问题描述】:

可能我的问题与其他标题重复,但是我阅读了太多标题并用谷歌检查了很多次。所以如果它重复,我很抱歉。

现在我有一个网址:

www.mysite.com/profile.php

我正在使用这个 URL 重写规则:

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

我可以更改我的网址,例如:

www.mysite.com/username

然后,我需要用另一个 get 参数更新我的 url:

www.mysite.com/username/photos

在这部分,我有一个类似的 URL:

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

我已经为上面的 url 尝试了这个 URL 规则:

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

但它不起作用。请帮忙。

非常感谢。

-------更新-----

现在我可以使用 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]

【问题讨论】:

    标签: regex apache .htaccess mod-rewrite


    【解决方案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]
    

    【讨论】:

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

      【讨论】:

      • 它可以工作,但我又遇到了问题。当第二个 get 参数为 null 时,此规则不起作用。我想同时使用 mysite.com/usernamemysite.com/username/details。那么我应该有多少条规则呢?
      【解决方案3】:

      如果你愿意,你可以只设置一个规则。我还会添加条件,以确保它不是真正的目录或文件。

      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 参数以查看它是否为空。如果不是,请同时显示详细信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-10
        • 1970-01-01
        • 2021-10-26
        相关资源
        最近更新 更多