当此 htaccess 文件中的重写规则导致内部服务器错误时,我该如何查找?

当此 htaccess 文件中的重写规则导致内部服务器错误时,我该如何查找?

我有一个 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 系列中的一个换行符,可能需要使用代码编辑器中的行号视图仔细检查。

相关内容