我有一个 htaccess 文件,其开头如下:
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} where-can-i-find-information-about-homer-training
RewriteRule ^(.*)$ http://usersupport.homerenergy.com/customer/en/portal/articles/2186858-where-can-i-find-information-about-homer-training-? [R=301,L]
RewriteCond %{QUERY_STRING} is-homer-pro-conservative-in-its-predictions
RewriteRule ^(.*)$ http://usersupport.homerenergy.com/customer/en/portal/articles/2186859-is-homer-pro-conservative-in-its-predictions-? [R=301,L]
...
类似规则还有 308 条。如您所见,这是为了将文章列表从一个站点重定向到另一个站点,其中匹配元素是 GET 字符串查询部分中的文章名称。
如果我只在文件中放入一两对RewriteCond
/符号,那么就可以了。但是当我使用整个文件时,就会出现 500 内部服务器错误。RewriteRule
显然,其中一条规则导致了错误,但扫描文件时我无法看清是哪一条。
查看错误日志,我可以看到这样的消息:
/var/www/html/.htaccess: RewriteCond: bad argument line '%{QUERY_STRING}'
这并没有告诉我太多信息。
我如何知道哪条规则导致了这个错误?
答案1
我相信您需要像这样放置您的测试值:
https://httpd.apache.org/docs/trunk/rewrite/remapping.html(部分:重写查询字符串)
RewriteCond "%{QUERY_STRING}" "where-can-i-find-information-about-homer-training"
RewriteRule "^(.*)$" "http://usersupport.homerenergy.com/customer/en/portal/articles/2186858-where-can-i-find-information-about-homer-training-?" [R=301,L]
我猜你的某个值中可能有一个空格。先试一下,也许可以修复它。我通常不使用“”来重写,但我通常也不使用空格,我的意思是,我从不在这类名称中使用空格。
顺便说一下,
^(.*)$
没有任何意义,因为
(.*)
已经意味着:全部。所以我认为开始和结束全部有点多余。
另一个可能的错误是,您只是错过了 500 系列中的一个换行符,可能需要使用代码编辑器中的行号视图仔细检查。