【问题标题】:Apache mod rewriteApache mod 重写
【发布时间】:2011-08-31 07:20:32
【问题描述】:

我在 .htaccess 中设置了 2 条规则

RewriteRule ^([^/]*)/([^/]*)/([^/]*)\.html$ page.php?name=$1&do=$2&newstitle=$3 [L]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)\.html$ page.php?name=$1&do=$2&cattitle=$3 [L]

这就是我调用 url 的方式:

www.domain.com/My-Page/news/News-Title.html
www.domain.com/My-Page/category/Category-Title.html

并且没有 mod 重写:

www.domain.com/page.php?name=My-Page&do=news&newstitle=News-Title
www.domain.com/page.php?name=My-Page&do=category&cattitle=Category-Title

现在的问题是,由于两条规则相似,无论如何它总是恢复到第一条规则。如果我删除第一条规则,第二个 url 可以正常工作,但是对于它们,它总是只重写第一条规则。

如何在两个规则都起作用的情况下实现这一点。我知道我遗漏了一些东西,但在 mod_rewrite 方面我的专业知识有限。

非常感谢任何帮助。

【问题讨论】:

    标签: mod-rewrite url-rewriting seo


    【解决方案1】:

    这两个规则并不相似,它们是相同的,所以它总是会执行第一个。

    如果我要这样做(我真的不会这样做,主要是因为我觉得这是一个更好地为 MVC 模式中的工厂保留的工作),我可能会这样说:

    RewriteRule ^([^/]*)/news/([^/]*)\.html$ page.php?name=$1&do=news&newstitle=$2 [L]
    RewriteRule ^([^/]*)/category/([^/]*)\.html$ page.php?name=$1&do=category&cattitle=$2 [L]
    

    您需要一些方法来区分它们。这应该很简单。

    编辑

    只是指出,你可以写这些:

    RewriteRule ^(.+)/news/(.+)\.html$ page.php?name=$1&do=news&newstitle=$2 [L]
    

    我的附加偏好是删除.html

    RewriteRule ^(.+)/news/(.+)$ page.php?name=$1&do=news&newstitle=$2 [L]
    

    我不喜欢以任何形式公开服务器技术,HTML 没有添加任何我们不知道的关于网站的内容。

    我个人使用类似的系统:

    RewriteRule ^(.*)$ index.php?page=$1 [L,QSA]
    

    该 URL 被 index.php 破解,格式如下:

    http://www.example.com/<controller>/<arg1>/<arg2>
    

    这样,我用一个重写语句告诉它去哪里,控制器返回适当的输出。之后我再也不用更新.htaccess。如果我需要新功能,我会编写一个新控制器。只是需要调查一下。

    【讨论】:

    • 非常感谢,现在一切都说得通了。
    猜你喜欢
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2012-09-09
    • 2012-06-14
    • 1970-01-01
    相关资源
    最近更新 更多