【问题标题】:rewrite urls , not all urls works重写网址,并非所有网址都有效
【发布时间】:2021-03-01 15:27:51
【问题描述】:

我有博客,我想重写链接

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 的技术,请给我一个链接

【问题讨论】:

  • /blog 是文件系统上的物理目录吗?你提到blog_posts.php,但你的指令都没有使用这个?您还有一条将/blog/<anything> 重写为news.php 的规则,而您的标准中没有提及?
  • 哦,抱歉没有回复它,现在我编辑了代码new.php 表示blog_posts.php,但为了便于理解,我把它写成博客我没有得到你的问题是/在文件系统上写一个物理目录?

标签: .htaccess mod-rewrite url-rewriting friendly-url


【解决方案1】:
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,这可能不是本意(如果是本意,那么它仍然是一个错误,因为您可能有重复的内容问题)。

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

我还询问(在 cmets 中)/blog 是否是文件系统上的物理目录?如果它是您的第一个示例 URL,即。 /blog 不是规范的,因为 mod_dir 将隐式触发 301 重定向以附加尾部斜杠。我假设这是一个物理目录,规范 URL 实际上是 /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 (nocase) 标志。您已经在正则表达式中检查小写字母和大写字母,但如果您在 URL 的其他部分也允许使用大写字母,那么您可能会遇到需要解决的重复内容(非规范)URL 问题。

参考:

【讨论】:

  • 它可以工作,但为什么 GET 请求 post-slug 不起作用
  • 我不确定你的意思?请求的实际 URL 是什么?
  • test.com/blog/slug我打开这个链接一切正常,但我无法让 slug 搜索帖子
  • 使用上述指令,/blog/slug 的请求将在内部重写为 single-post.php?post-slug=slug - 这是预期的吗?如果您“无法让 slug 搜索帖子”,那么这似乎是您的 single_post.php 脚本的问题?
  • 我讨厌自己的人,我写的是post-topic而不是post-slug,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 2017-05-10
  • 2018-07-31
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 2010-10-08
相关资源
最近更新 更多