问题描述
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]
解决方法
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 问题。
参考: