我在 .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/