mod-rewrite - Apache 模组重写

标签 mod-rewrite url-rewriting seo

我在 .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 方面的专业知识有限。

非常感谢任何帮助。

最佳答案

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

如果我要这样做(我真的不会,主要是因为我觉得这是一个更好地留给 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>

这样,通过一个重写语句,我告诉它去哪里,然后 Controller 返回适当的输出。之后我再也不需要更新 .htaccess 了。如果我需要新功能,我会编写一个新 Controller 。只是需要研究的东西。

关于mod-rewrite - Apache 模组重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7250717/

相关文章:

linux - 如何通过htaccess删除url中的点

linux - 如何使用 URL 重写在我的站点中反射(reflect)另一个站点?

wordpress - 将 domain.com/keyword 作为主页 URL

apache - 在 Apache 服务器上安装 cakephp 时未找到 cakephp/app/wwwroot/

wordpress - 使用 htaccess 屏蔽 wp-admin 文件夹

url-rewriting - 如何在Nginx中更改$ request_uri?

reactjs - React JSON-LD 架构中的脚本标签

seo - 将 schema.org 添加到站点

javascript - SEO - 显示 block anchor 标记包含标题和短描述与仅带有 js 的标题

authentication - .htaccess mod-rewrite 与子文件夹身份验证冲突