从 Apache 到 LiteSpeed 的 htaccess 迁移问题
htaccess migration issue from Apache to LiteSpeed
我最近在后端进行了一次 URL spring 清理,目前我正在努力处理其中一个 .htaccess 重定向。
我要重定向的是:
https://www.example.com/directory/?type=supplier&category=celebrant&sort=latest
应该转到:
https://www.example.com/suppliers/type/celebrant
我最终得到了这个正则表达式并在 https://technicalseo.com/tools/htaccess/ 上对其进行了测试,但出于某种原因,我的 LiteSpeed Enterprise 服务器似乎不喜欢它(其他正则表达式工作)。
RewriteCond %{REQUEST_URI} ^\/directory/$ [C]
RewriteCond %{QUERY_STRING} type=supplier&category=([a-zA-Z0-9-_]*) [C]
RewriteRule ^/?(.*)$ /suppliers/type/%1 [L,QSD,R=301]
关于为什么它不适用于企业版 LiteSpeed 的任何想法?
更新:
我确实按照 George Wang 的建议启用了调试日志记录,我得到的是:
unknown rewrite condition flag while parsing: RewriteCond %{REQUEST_URI} ^/directory/$ [C]
Invalid rewrite condition while parsing: RewriteCond %{REQUEST_URI} ^/directory/$ [C]
unknown rewrite condition flag while parsing: RewriteCond %{QUERY_STRING} type=supplier&category=([a-zA-Z0-9-_]*) [C]
Invalid rewrite condition while parsing: RewriteCond %{QUERY_STRING} type=supplier&category=([a-zA-Z0-9-_]*) [C]
Ignored due to previous error while parsing: RewriteRule ^/?(.*)$ /wedding-suppliers/type/%1 [L,QSD,R=301]
对我来说很模糊:(
你可以试试
RewriteCond %{REQUEST_URI} ^/directory/$ [C]
看看有没有帮助。如果没有,您可能需要打开重写调试日志记录以查明发生了什么。 :-)
RewriteCond %{REQUEST_URI} ^\/directory/$ [C]
RewriteCond %{QUERY_STRING} type=supplier&category=([a-zA-Z0-9-_]*) [C]
RewriteRule ^/?(.*)$ /suppliers/type/%1 [L,QSD,R=301]
您需要删除 C
(chain
) 标志。这是一个 RewriteRule
标志,它在 RewriteCond
指令上没有意义。 (C
标志将 规则 链接在一起,而不是指令。)
Apache 会因 500 内部服务器错误而中断,但我怀疑 LiteSpeed 可能只是默默地失败了。
[a-zA-Z0-9-_]*
- 此 regex/character class 不正确,因为 -
(连字符)需要转义或出现在字符的开头或结尾class。否则它会尝试计算一个范围。这也可以使用 \w
(单词字符) shorthand 字符 class.
来简化
您也可以删除第一个条件并改为在 RewriteRule
指令中执行 URL 路径检查。
例如:
RewriteCond %{QUERY_STRING} ^type=supplier&category=([\w-]*)
RewriteRule ^directory/$ /suppliers/type/%1 [QSD,R=301,L]
如果 LiteSpeed 不喜欢 QSD
标志(Apache 2.4 的新标志),则将其删除并在替换字符串的末尾附加一个 ?
。 IE。 ... /suppliers/type/%1? [R=301,L]
此重定向需要靠近 .htaccess
文件的顶部。
我最近在后端进行了一次 URL spring 清理,目前我正在努力处理其中一个 .htaccess 重定向。
我要重定向的是:
https://www.example.com/directory/?type=supplier&category=celebrant&sort=latest
应该转到:
https://www.example.com/suppliers/type/celebrant
我最终得到了这个正则表达式并在 https://technicalseo.com/tools/htaccess/ 上对其进行了测试,但出于某种原因,我的 LiteSpeed Enterprise 服务器似乎不喜欢它(其他正则表达式工作)。
RewriteCond %{REQUEST_URI} ^\/directory/$ [C]
RewriteCond %{QUERY_STRING} type=supplier&category=([a-zA-Z0-9-_]*) [C]
RewriteRule ^/?(.*)$ /suppliers/type/%1 [L,QSD,R=301]
关于为什么它不适用于企业版 LiteSpeed 的任何想法?
更新:
我确实按照 George Wang 的建议启用了调试日志记录,我得到的是:
unknown rewrite condition flag while parsing: RewriteCond %{REQUEST_URI} ^/directory/$ [C]
Invalid rewrite condition while parsing: RewriteCond %{REQUEST_URI} ^/directory/$ [C]
unknown rewrite condition flag while parsing: RewriteCond %{QUERY_STRING} type=supplier&category=([a-zA-Z0-9-_]*) [C]
Invalid rewrite condition while parsing: RewriteCond %{QUERY_STRING} type=supplier&category=([a-zA-Z0-9-_]*) [C]
Ignored due to previous error while parsing: RewriteRule ^/?(.*)$ /wedding-suppliers/type/%1 [L,QSD,R=301]
对我来说很模糊:(
你可以试试
RewriteCond %{REQUEST_URI} ^/directory/$ [C]
看看有没有帮助。如果没有,您可能需要打开重写调试日志记录以查明发生了什么。 :-)
RewriteCond %{REQUEST_URI} ^\/directory/$ [C] RewriteCond %{QUERY_STRING} type=supplier&category=([a-zA-Z0-9-_]*) [C] RewriteRule ^/?(.*)$ /suppliers/type/%1 [L,QSD,R=301]
您需要删除 C
(chain
) 标志。这是一个 RewriteRule
标志,它在 RewriteCond
指令上没有意义。 (C
标志将 规则 链接在一起,而不是指令。)
Apache 会因 500 内部服务器错误而中断,但我怀疑 LiteSpeed 可能只是默默地失败了。
[a-zA-Z0-9-_]*
- 此 regex/character class 不正确,因为 -
(连字符)需要转义或出现在字符的开头或结尾class。否则它会尝试计算一个范围。这也可以使用 \w
(单词字符) shorthand 字符 class.
您也可以删除第一个条件并改为在 RewriteRule
指令中执行 URL 路径检查。
例如:
RewriteCond %{QUERY_STRING} ^type=supplier&category=([\w-]*)
RewriteRule ^directory/$ /suppliers/type/%1 [QSD,R=301,L]
如果 LiteSpeed 不喜欢 QSD
标志(Apache 2.4 的新标志),则将其删除并在替换字符串的末尾附加一个 ?
。 IE。 ... /suppliers/type/%1? [R=301,L]
此重定向需要靠近 .htaccess
文件的顶部。