首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复mod_rewrite正则表达式生成500和404错误

如何修复mod_rewrite正则表达式生成500和404错误
EN

Stack Overflow用户
提问于 2013-01-13 11:20:42
回答 3查看 147关注 0票数 1

我的.htaccess中有下面这行

代码语言:javascript
复制
RewriteRule ^folder/(.*)$ /folder/?value=$1 [L]

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

如果我简单地将其更改为

代码语言:javascript
复制
RewriteRule ^folder/(.*)\.html$ /folder/?value=$1 [L]

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

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

你知道为什么我的正则表达式每次都会出现500内部服务器错误吗?

EN

回答 3

Stack Overflow用户

发布于 2013-01-13 11:39:07

你可能会收到500个错误,因为你的规则是循环的。规则的目标与模式本身匹配(/folder/?value=value^folder/(.*)$匹配,因为查询字符串在匹配之前被剥离)。尝试包括应用于规则的条件,如下所示:

代码语言:javascript
复制
RewriteCond %{REQUEST_FILENAME !-f
RewriteCond %{REQUEST_FILENAME !-d
RewriteRule ^folder/(.*)$ /folder/?value=$1 [L]

或者:

代码语言:javascript
复制
RewriteCond %{REQUEST_URI} !^/folder/?$
RewriteRule ^folder/(.*)$ /folder/?value=$1 [L]

但从技术上讲,@Suku建议的应该是可行的:

代码语言:javascript
复制
RewriteRule ^folder/(.+)$ /folder/?value=$1 [L]
票数 2
EN

Stack Overflow用户

发布于 2013-01-13 14:05:21

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

代码语言:javascript
复制
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错误。

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

票数 1
EN

Stack Overflow用户

发布于 2013-01-15 02:18:19

以下是该规则的执行情况:

代码语言:javascript
复制
RewriteRule ^folder/(.*)$ /folder/?value=$1 [L]

由于

  • /folder/test

,请求的URL与模式匹配并被重写为 stops

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

与模式匹配并重写为/folder/?value=

  • Repeat

  • 重写的/folder/?value=test

正如在其他评论/答案中提到的,将*更改为+,它应该可以解决问题。如果存在/folder/ index.php并包含,则需要额外的一行:

代码语言:javascript
复制
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^folder/(.+)$ /folder/?value=$1 [L]

重写之后,Apache将为现有目录提供默认文档,这将引发另一次重写迭代。这种情况会阻止mod_rewrite将/folder/index.php?value=test改回/folder/?value=index.php

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14300353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档