重写 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 问题这需要解决。
参考:
我有博客,我想重写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 问题这需要解决。
参考: