【问题标题】:htaccess regexp Underline and Space doesn't workhtaccess 正则表达式下划线和空格不起作用
【发布时间】:2013-12-29 23:58:41
【问题描述】:
RewriteRule ^([A-Za-z0-9'"%ãõáéíóúâêîôûàÁÃÕÁÉÍÓÚÂÊÎÔÛÀ\/\.\-]*)$ public_html/$1 [NC]

我在这里使用这个正则表达式,它工作得很好,但是如果我举个例子:

RewriteRule ^([A-Za-z0-9 _'"%ãõáéíóúâêîôûàÁÃÕÁÉÍÓÚÂÊÎÔÛÀ\/\.\-]*)$ public_html/$1 [NC]

这里不行。由于空格和下划线,我想在正则表达式中包含空格和下划线,但它根本不起作用。我必须添加一些特别的东西吗?

这也行不通:

RewriteRule ^(.*)$ public_html/$1 [NC]

我希望能够输入任何内容并在 public_html 文件夹中打开。

例如,我输入:www.mysite.com/site_1.php 然后打开:www.mysite.com/public_html/site_1.php

这个 .htaccess 表达式正在使用 Apache 2.2.17 的 HostGator 服务器中进行测试 我也在我的 localhost Apache 2.2.17 中进行了测试,同样发生了。

添加 _ 和空格或 .* 时给出的错误是这样的:

内部服务器错误

服务器遇到内部错误或配置错误,并且 无法完成您的请求。

请联系服务器管理员 admin@localhost 并告知 错误发生的时间,以及您可能做过的任何事情 这可能是导致错误的原因。

有关此错误的更多信息可能在服务器错误中可用 记录。

提前谢谢你们。

【问题讨论】:

  • 转义空格,否则 Apache 会将其视为正则表达式模式的结束。所以让它\space 而不是space。至于内部服务器错误,请查看服务器的错误日志。它将包含导致它的确切原因(可能导致重写的空格字符有语法错误)。
  • 感谢您的回答,这有助于解决空间问题,但是其余的呢? .* 和下划线?
  • 不要认为_ 是那些正则表达式中的元字符。但是无论如何尝试逃避它,看看会发生什么。使用_.* 时仍然出现内部错误?再次检查错误日志,看看它是否是不同的消息。
  • 我试图逃跑,但它不是元字符,我删除了日志文件并刚刚加载了页面,那里没有出现错误。也许还有另一种方法来完成匹配所有字符?
  • ^(.*)$ 每次都会匹配所有内容,因此您最终会陷入连续循环。你需要一个 RewriteCond 来确保你还没有在 public_html 中。您应该可以毫无问题地添加_,您可以尝试使用\s 处理空格 - 我相信这是正则表达式中空格的元字符。

标签: regex apache .htaccess mod-rewrite


【解决方案1】:

来自regular-expressions.info

字符类中唯一的特殊字符或元字符是右括号 (])、反斜杠 (\)、插入符号 (^) 和连字符 (-)。通常的元字符是字符类中的普通字符,不需要用反斜杠转义。

您不应该转义字符集中的字符,而不是上面提到的字符。这里的简单技巧是确保将连字符保留在字符类的 VERY END。这将连字符标识为文字。

RewriteRule ^([a-zA-Z0-9'"%ãõáéíóúâêîôûàÁÃÕÁÉÍÓÚÂÊÎÔÛÀ _/.-]*)$ public_html/$1 [NC]

为避免“连续循环”,您可以在匹配规则之前包含此条件:

RewriteCond %{ENV:REDIRECT_STATUS} ^$

另外,如果您只是想匹配您还谈到的所有内容,我通常会执行以下操作。请注意,%{QUERY_STRING} 可以传递任何 GET 变量。如果您不打算使用常规 GET 变量,可以将其删除。

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(.*)$ /index.php?request=$1&%{QUERY_STRING}

希望这些信息对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    相关资源
    最近更新 更多