使用 htaccess 重定向,使用斜杠、下划线或日期作为分隔符 - 友好的网址

Redirect using htaccess using a slash, underscore or dates as separators - friendly urls

提问人:hobbsie 提问时间:5/31/2023 最后编辑:MrWhitehobbsie 更新时间:6/1/2023 访问量:42

问:

这工作正常:

https://example.com/2023/not-the-dinner-day 

使用以下命令RewiteRule

RewriteRule ^(\d{4})/not-the-dinner-day/?$ archive/reports/$1/ntdd.php [NC,L]

我想获取此新 URL:

https://example.com/2023/not-the-dinner-day-photographs

从这个旧 URL

https://example.com/archive/galleries/2023/20230204_ntdd/

我尝试过各种各样的方法,包括:

RewriteEngine On
RewriteRule ^(\d{4})/not-the-dinner-day-photographs/?$ archive/galleries/$1/$2_ntdd/ [NC,L]

匹配最后一个文件夹似乎给我带来了问题,重写模块已打开。20230204_ntdd

php 正则表达式 apache .htaccess mod-rewrite

评论

0赞 Rob Eyre 5/31/2023
你在右边,但左手边只有一组括号。如何从原始 URL 确定“0204”部分?会一直都是这个值吗?$2
0赞 Rob Eyre 5/31/2023
如果“0204”部分是硬编码的(即所有年份都相同),那么您可以使用RewriteRule ^(\d{4})/not-the-dinner-day-photographs/?$ archive/galleries/$1/$10204_ntdd/ [NC,L]
0赞 hobbsie 5/31/2023
“0204”每年都会变化,因为它是当月的第一个星期六,它可以是任何四个数字
0赞 MrWhite 5/31/2023
那么,你有“0101”、“0502”、“0503”等吗?还有,每个月一个?还是每年只有一个特定的月份?
0赞 hobbsie 5/31/2023
我有一个年份文件夹,后跟一个yearmonthday_ntdd文件夹,每年只针对一个特定的月份

答:

0赞 MrWhite 6/1/2023 #1

由于请求的 URL 中不存在 (MMDD) 部分,因此您需要对此进行硬编码。幸运的是,任何一年都只有一个 MMDD。0204

如果您有权访问服务器配置,则可以实现包含一对一映射的 - 然后可以在 中查找。RewriteMap.htaccess

否则,您可以在以下位置执行如下操作:.htaccess

RewriteCond $1-0202 2019-(\d{4}) [OR]
RewriteCond $1-0201 2020-(\d{4}) [OR]
RewriteCond $1-0206 2021-(\d{4}) [OR]
RewriteCond $1-0205 2022-(\d{4}) [OR]
RewriteCond $1-0204 2023-(\d{4})
RewriteRule ^(\d{4})/not-the-dinner-day-photographs/?$ archive/galleries/$1/$1%1_ntdd/index.php [NC,L]

上述条件包含YYYY到MMDD的一对一映射。 是从模式中捕获的 4 位年份,然后 CondPatternTestString 中捕获相应的 MMDD,使用生成的替换字符串中的反向引用进行检索。$1RewriteRule%1


旁白:

但是,您的原始规则存在一些潜在的 SEO 问题:

  1. 您允许在请求的 URL 上使用可选的尾部斜杠。但两者都会返回相同的资源。严格来说,这是两个不同的 URL,可能会造成重复的内容问题。如果有可能收到两个 URL(带和不带尾部斜杠),那么理想情况下,您应该从一个 URL 重定向到另一个 URL(无论哪个是规范的)。

  2. 您允许不区分大小写的匹配。同样,这可能会造成重复的内容问题。如果您确实有混合大小写的请求,那么您应该使用外部重定向来规范/更正请求。请参阅以下内容:
    如何在 .htaccess 中将 URL 从大写重写为小写

  3. 如果您要更改现有的 URL 结构(已被第三方索引和/或链接),那么您需要在另一个指令中实现外部 301 重定向,从旧到新,以保留 SEO。