如何mod_rewrite重定向特定的字符串长度?

How to mod_rewrite to redirect specific string length?

提问人:delphirules 提问时间:8/2/2023 最后编辑:MrWhitedelphirules 更新时间:8/16/2023 访问量:32

问:

这是我要做的:当有人使用固定的 32 个字符字符串“文件夹”访问我的网站时,它将重定向到将此字符串作为参数传递的特定站点

例如:

www.example.com/29fe7a48516763c7c3033929e3d4c2a0

将重定向到

www.example.com/myurl?param=29fe7a48516763c7c3033929e3d4c2a0 

仅当文件夹不存在且具有 32 个字符时,这才适用。29fe7a48516763c7c3033929e3d4c2a0

我需要使用.htaccess文件来执行此操作。

正则表达式 apache .htaccess mod-rewrite

评论

0赞 MrWhite 8/2/2023
这些指令在哪里使用?在还是服务器配置中?您确定想要外部“重定向”而不是内部“重写”吗?(严格来说,“重定向”不需要mod_rewrite,除非配置文件中已有mod_rewrite指令。.htaccess

答:

3赞 MrWhite 8/2/2023 #1

您可以使用正则表达式量词(其中是任意数字)来确定前一个标记的确切数字。{n}n

看起来这是一个十六进制字符串(仅限字母和数字),而不是字面上的任何字符串,因此正则表达式应相应匹配。a-f0-9

然后,使用 mod_rewrite您可以执行以下操作来执行“重定向”,如示例所示:

RewriteEngine On

RewriteRule ^[a-f0-9]{32}$ /myurl?param=$0 [R=302,L]

以上是 302(临时)重定向。反向引用包含模式的整个匹配项(即 32 个字符的十六进制字符串的值)。$0RewriteRule

但是,我认为这应该是内部“重写”,而不是外部“重定向”。即。URL 不应更改。如果是这种情况,则应按如下方式调整规则:

RewriteRule ^[a-f0-9]{32}$ myurl?param=$0 [L]

请注意,删除了替换字符串上的标志和斜杠前缀。请注意,这应该是一个相对的文件系统路径。Rmyurl

更新:由于这是在 中使用,您应该删除正则表达式上的前缀(我已经更新了上述规则)。.htaccess/?

但是,如果要在服务器虚拟主机上下文中使用,则需要更改规则,如下所示:

RewriteRule ^/([a-f0-9]{32})$ /myurl?param=$1 [R=302,L]

请注意模式中的斜杠前缀和附加括号 (regex),并在替换字符串中使用反向引用 (而不是 )。您可以将斜杠前缀设置为可选,以允许它在目录 () 上下文中工作。RewriteRule$1$0.htaccess