重写网址,并非所有网址都有效

问题描述

我有博客,我想重写链接

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}

我的问题是当我访问帖子或主题时,它会访问 site.com/blog blog_posts.PHP

我认为是因为当访问 blog_posts.PHP 并在它之后写任何认为 kbjsflgjdouihaiufhslkdf 访问 blog_posts.PHP

我的尝试

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

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

解决方法

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

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

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

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

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

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

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

请尝试以下操作:

/blog

我还删除了 RewriteRule ^blog/topic/([0-9a-zA-Zأ-ي-]+)$ filtered_posts.php?topic=$1 [L] RewriteRule ^blog/([0-9a-zA-Zأ-ي-]+)$ single_post.php?post-slug=$1 [L] RewriteRule ^blog/$ blog_posts.php [L] (NC) 标志。您已经在检查正则表达式中的小写和大写字母,但如果您还允许在 URL 的其他部分使用大写字母,那么您可能存在需要解决的重复内容(非规范)URL 问题。

参考: