2013-01-13 78 views
1

解决mod_rewrite的正则表达式我有以下线在我的.htaccess如何从生产500和404错误

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与value.html在$ _GET设定。

我希望能够接受诸如value,value.com,value-4,otheritem之类的任何内容。

关于为什么我的正则表达式是500的任何想法内部服务器每次都出错?

+0

'RewriteRule ^文件夹/(.+)$/文件夹/?值= $ 1 [L]'试试这个。 '*'的意思是,'零'或'更多'匹配。 “+”表示“ONE”或“MORE”。 – Suku

+0

不改变任何内容。但谢谢你的提示。 – Calvin

+0

你是404或500的?你的错误日志说什么? –

回答

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)。

+0

hmm,检查日志我得到了重定向循环,但没有一个解决方案已经解决了它。仍然得到相同的500循环错误。 – Calvin

+0

@Calvin你有其他规则吗? –

+0

只是'ErrorDocument 404 http:// example.com/404'和 'ErrorDocument 403 http:// example.com/403' – Calvin

1

您可以尝试这种方法,将/foldervalue(键值“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必须存在在映射的URL中,否则会出现404错误。

此规则集在真正的服务器上进行了测试,没有问题。

1

下面是这个规则会发生什么:

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

然而,因为路径/文件名改变了(/folder/test是来到/folder/),mod_rewrite的将执行另一次迭代:

  • 改写 URL /folder/?value=test的模式匹配,并改写为/folder/?value=
  • 重复

正如在其他的意见/答案中提到,改变*+它应该解决这个问题。 如果/folder/存在并且包含index.php则需要一个额外的行:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^folder/(.+)$ /folder/?value=$1 [L] 

会发生什么事是重写后,阿帕奇服务于该触发重写的另一次迭代的现有目录的默认文档。该条件可防止mod_rewrite将/folder/index.php?value=test更改回/folder/?value=index.php