用等号和短文件夹名的URL从.htacess重写规则

时间:2018-12-03 14:40:06

标签: .htaccess mod-rewrite

对于以下示例URL,我需要在.htaccess中重写规则:

https://www.example.com/book=18ABCDEFG 

这是我需要的结果URL:

https://www.example.com/books/2018/ABCDEFG.pdf

我花了几个小时进行谷歌搜索并试图解决这个问题,但是我真的很困。如果那里有重写向导,我将非常感谢您的帮助。

已编辑

这是我到目前为止提出的,但是唯一的结果是404(未找到):

RewriteEngine on
RewriteCond %{QUERY_STRING} ^book=18(.*)$
RewriteRule ^(.*)book=(.*)$ http://www.examplesite.com/books/2018/$1.pdf [R=301,L]

我希望$1应该引用“ 18”之后的字符串,因为条件中唯一带括号的组包含该字符串,但是到目前为止,我还没有找到正确的语法。

我也应该解释“ 18”。现在,URL有所不同,采用这种模式的书本URL不会再有除2018年以外的年份。这样就可以进行硬编码了。

但是如何在重写规则中引用“ 18”之后的字符串?

1 个答案:

答案 0 :(得分:1)

  

这是我到目前为止提出的,但是唯一的结果是404(未找到):

RewriteEngine on
RewriteCond %{QUERY_STRING} ^book=18(.*)$
RewriteRule ^(.*)book=(.*)$ http://www.examplesite.com/books/2018/$1.pdf [R=301,L]

如评论中所述,它试图同时匹配两个不同的URL:一个在查询字符串中包含信息(在“虚数” ?之后),另一个在其中包含在URL路径中。因此,它可能什么也没做。因此是404。

  

我希望$1应该引用“ 18”之后的字符串,因为条件中唯一带括号的组包含该字符串

$1RewriteRule 模式中的第一个括号组(其中有两个)。如果要匹配最后匹配的条件中的第一个子模式,则需要使用%1形式的反向引用。

但是,您的示例不包含?,因此没有查询字符串。该信息改为包含在UR1路径中。 (除非这是您的问题中的错字?!它看起来像是错字,因为=是多余的。但这也将完全改变您的问题。)

要重定向URL example.com/book=18ABCDEFG(即URL路径中的信息),则在文档根目录中.htaccess文件顶部附近需要以下内容:

RewriteEngine on
RewriteRule ^book=18([^/]+)$ /books/2018/$1.pdf [R=302,L]

如果代码只能是特定字符,则正则表达式应适当地特定。就目前而言,它几乎可以匹配任何东西。

使用302(临时)重定向进行测试,只有在确定它可以正常工作(如果打算用作永久重定向并由浏览器缓存)时,才更改为301(永久)。 / p>

在测试之前,您需要清除浏览器缓存。