重写 url ,并非所有 url 都有效

rewrite urls , not all urls works

我有博客,我想重写link

site.com/blog -> 对于博客索引 blog_posts.php

site.com/blog/{post-slug} -> 对于 single_post.php?post-slug={post-slug}

site.com/blog/topic/{topic} -> 对于 filtered_posts.php?topic={topic}

我的问题是当我访问 post 或主题时它会访问 site.com/blog blog_posts.php

我认为是因为当访问 blog_posts.php 并在其后写任何像 kbjsflgjdouihaiufhslkdf 访问 blog_posts.php

我的尝试

RewriteRule ^blog/([0-9a-zA-Zأ-ي-]+)/ single_post.php?post-slug= [NC,L]
RewriteRule ^blog/ blog_posts.php [NC,L]
RewriteRule ^blog/topic/([0-9a-zA-Zأ-ي-]+)/ filtered_posts.php?topic= [NC,L]

如果有任何关于 .htaccess 的技术,请给我一个 link

RewriteRule ^blog/([0-9a-zA-Zأ-ي-]+)/ single_post.php?post-slug= [NC,L]
RewriteRule ^blog/ blog_posts.php [NC,L]
RewriteRule ^blog/topic/([0-9a-zA-Zأ-ي-]+)/ filtered_posts.php?topic= [NC,L]

您需要更改指令的顺序and/or 使正则表达式更加具体。顺序很重要 - 最具体的正则表达式需要排在第一位。

例如,您的第一条规则 ^blog/([0-9a-zA-Zأ-ي-]+)/ 自然会匹配 /blog/topic/<something> 形式的任何 URL,因此请求被重写为 single_post.php,第三条规则是从未处理过。

您的第二条规则 (^blog/) 匹配任何其他仅以 /blog 开头的规则,因此,第三条规则将永远不会被处理。

您的示例 URLs,例如 /blog/{post-slug} 不包含斜杠后缀,但是,您编写的指令看起来好像您正在尝试匹配一个?虽然您没有在正则表达式上使用任何字符串结尾锚点,但您可能匹配得太多了。例如,正则表达式 ^blog/([0-9a-zA-Zأ-ي-]+)/ 将匹配 /blog/{post-slug}/1234/something/etc 形式的 URL 这可能不是意图(如果是意图那么它仍然是一个错误,因为你可能有重复的内容问题)。

我假设您的 URL 与您的示例一致 - 没有尾部斜杠。

我还询问(在评论中)是否 /blog 文件系统上的物理目录?如果它是您的第一个示例 URL,即。 /blog 不是规范的,因为 mod_dir 将隐式触发 301 重定向以附加尾部斜杠。我假设这是一个物理目录,规范的 URL 实际上是 /blog/,而不是 /blog.

请尝试以下操作:

RewriteRule ^blog/topic/([0-9a-zA-Zأ-ي-]+)$ filtered_posts.php?topic= [L]
RewriteRule ^blog/([0-9a-zA-Zأ-ي-]+)$ single_post.php?post-slug= [L]
RewriteRule ^blog/$ blog_posts.php [L]

我还删除了 NC (nocase) 标志。您已经在正则表达式中同时检查小写和大写字母,但是如果您还允许 URL 的其他部分使用大写字母,那么您可能会遇到重复内容(非规范)URL 问题这需要解决。

参考: