1

我的 .htaccess 中有以下行

RewriteRule ^folder/(.*)$ /folder/?value=$1 [L]

当我有任何东西时,这总是给我一个 500 内部错误http://website.com/folder/value

如果我只是将其更改为

RewriteRule ^folder/(.*)\.html$ /folder/?value=$1 [L]

它正确地将我发送到http://website.com/folder/value.html在 $_GET 中设置的 value.html。

我希望能够接受任何东西,例如 value、value.com、value-4、otheritem。

关于为什么我的正则表达式每次都是 500 Internal Server Error'ing 的任何想法?

4

3 回答 3

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 实例中,上述所有方法都在 whileRewriteRule ^folder/(.*)$ /folder/?value=$1 [L]循环中工作(并返回 500)。

于 2013-01-13T03:39:07.257 回答
1

以下是此规则发生的情况:

RewriteRule ^folder/(.*)$ /folder/?value=$1 [L]
  • 请求的URL/folder/test与模式匹配并重写为/folder/?value=test
  • 由于[L]标志而停止重写

但是,由于路径/文件名已更改(/folder/test成为/folder/), mod_rewrite 将执行另一次迭代:

  • 重写后的URL/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.

于 2013-01-14T18:18:19.390 回答
1

您可以尝试这种将/foldervalue(键“值”的值)都视为动态字符串的方法,而不管它们的格式如何。

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必须存在映射的URL,否则会出现404错误。

此规则集在真实服务器中进行了测试,没有出现任何问题。

于 2013-01-13T06:05:21.180 回答