我的.htaccess
中有以下一行RewriteRule ^folder/(.*)$ /folder/?value=$1 [L]
当http://website.com/folder/value
处有任何内容时,这总是给我500个内部错误。
如果我只是将其改为
RewriteRule ^folder/(.*)\.html$ /folder/?value=$1 [L]
它正确地将我发送到http://website.com/folder/value.html
,并在$ _GET中设置了value.html。
我希望能够接受诸如value,value.com,value-4,otheritem之类的任何内容。
关于为什么我的正则表达式每次都是500内部服务器错误的任何想法?
答案 0 :(得分:2)
您可能会收到500个错误,因为您的规则正在循环播放。规则的目标与模式本身匹配(/folder/?value=value
匹配^folder/(.*)$
,因为查询字符串在匹配之前被剥离)。尝试包括适用于规则的条件,例如:
RewriteCond %{REQUEST_FILENAME !-f
RewriteCond %{REQUEST_FILENAME !-d
RewriteRule ^folder/(.*)$ /folder/?value=$1 [L]
或者:
RewriteCond %{REQUEST_URI} !^/folder/?$
RewriteRule ^folder/(.*)$ /folder/?value=$1 [L]
但从技术上来说@Suku建议应该有效:
RewriteRule ^folder/(.+)$ /folder/?value=$1 [L]
在我的测试apache实例中,所有上述工作都在RewriteRule ^folder/(.*)$ /folder/?value=$1 [L]
循环(并返回500)。
答案 1 :(得分:1)
您可以尝试使用此方法将/folder
和value
(键值“值”)视为动态字符串,无论其格式如何。
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} .*/([^/]+)/([^/]+)/? [NC]
RewriteRule .* %1/?value=%2 [L]
它在内部映射一个像这样的URL:
http://website.com/anyfolder/anyvalue
或
http://website.com/any/number/of/folders/anyfolder/anyvalue
要:
http://website.com/anyfolder/?value=anyvalue
当然/anyfolder
必须存在于映射的网址中,否则会出现404错误。
此规则集在真实服务器中进行了测试,没有任何问题。
答案 2 :(得分:1)
以下是此规则的内容:
RewriteRule ^folder/(.*)$ /folder/?value=$1 [L]
/folder/test
与模式匹配,并重写为/folder/?value=test
[L]
标志但是,由于路径/文件名已更改(/folder/test
变为/folder/
),因此mod_rewrite将执行另一次迭代:
/folder/?value=test
与模式匹配,并重写为/folder/?value=
正如其他评论/答案所述,将*
更改为+
,它应该可以解决问题。 如果/folder/
存在且包含index.php
,则需要额外一行:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^folder/(.+)$ /folder/?value=$1 [L]
在重写之后,Apache会为现有目录提供默认文档,从而触发另一次重写迭代。该条件阻止mod_rewrite将/folder/index.php?value=test
更改回/folder/?value=index.php
。