【问题标题】:Rewrite rule in .htacess from URL with equal sign and short folder name使用等号和短文件夹名称从 URL 重写 .htaccess
【发布时间】:2018-12-03 14:40:05
【问题描述】:

我需要在我的 .htaccess 中为以下示例 URL 设置重写规则:

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”之后的字符串呢?

【问题讨论】:

  • 旧网址中没有?,例如:https://www.examplesite.com/?book=18ABCDEFG
  • ? 在请求的 URL 中是否存在(或不存在)会改变您编写指令以匹配它的方式。您发布的指令试图匹配两者,一个包含?(即“查询字符串”)的URL和一个没有?的URL - 所以这永远不会匹配,除非你的URL真的是表格:example.com/book=18ABCDEFG?book=18ABCDEFG?但是,您并没有像在查询字符串中那样排除 URL 路径中的“18”?
  • 不,没有?在旧网址中。该 URL 与我的问题中显示的形式完全相同。所以我应该使用什么而不是 QUERY_STRING?

标签: .htaccess mod-rewrite


【解决方案1】:

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

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

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

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

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

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

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

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

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

使用 302(临时)重定向进行测试,并且只有在您确定它工作正常时才更改为 301(永久)(如果这是一个 永久 重定向并由浏览器缓存)。

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

【讨论】:

    猜你喜欢
    • 2014-03-01
    • 2010-11-18
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 2021-12-23
    • 2016-04-13
    相关资源
    最近更新 更多