2009-08-22 120 views
1

我有从htaccess重定向的页面。 现在我可以通过德国的字符作为PARAMShtaccess字符编码问题

site.com/maörx/idasd

Options +FollowSymLinks 
RewriteEngine on 
RewriteRule ^([a-zA-Z0-9äÄöÖüÜéß\-]*)/?$ page.php?var=$1 [L] 

它是工作在本地主机。但不是在服务器上.... 服务器我得到同样的老问题(错误404:未找到对象!)

是上面的代码是服务器正确的?

回答

3

如果您的规则有效,它将依赖字符编码(在.htaccess文件中使用的编码和用于请求的URI的编码)。如果两者都相同,它应该可以工作。

现在大多数用户代理使用ISO 8859-1或UTF-8编码通过HTTP请求的URL。但UTF-8早晚会​​取代ISO 8859-1。

而当bobince注意到注释时,Apache在解释.htaccess文件时在内部使用单字节编码ASCII。所以当你使用像UTF-8这样的多字节编码时,你可能会遇到问题。不过是编码independed如下:

# for ISO 8859-1 
RewriteRule ^([a-zA-Z0-9\xC4\xD6\xDC\xDF\xE4\xE9\xF6\xFC-]*)/?$ page.php?var=$1 [L] 
# for UTF-8 
RewriteRule ^(([a-zA-Z0-9-]|\xC3\x84|\xC3\x96|\xC3\x9C|\xC3\x9F|\xC3\xA4|\xC3\xA9|\xC3\xB6|\xC3\xBC)*)/?$ page.php?var=$1 [L] 

但是为了避免这样的结构,你可以只排除斜线和斑点,后来与PHP验证的值:

RewriteRule ^([^/.]*)/?$ page.php?var=$1 [L] 
+0

那么为什么它只能在服务器发生。 .. 我的本地机器正在工作.... :( – coderex 2009-08-22 10:37:47

+0

也许你正在使用不同的编码,无论是文件还是URI。 – Gumbo 2009-08-22 10:46:15

+1

+1,Apache处理字节,所以原来的规则只适用于ISO-8859-1提交,这是很少见的,因为今天的URL是事实上的UTF-8。最好避免这一层的问题,允许任何老字符通过;在PHP脚本中做任何你需要的字符检查,把这种逻辑放在Web服务器层中作为重写是没有意义的。 – bobince 2009-08-22 11:52:04

0

除非确切地说这些变音符号,您应该在正则表达式中使用POSIX字符类,例如[:alpha:],[:alphanum:],[:upper:]和[:lower: ]。

请参见例如POSIX character classes在维基百科有关正则表达式的文章。