如何使用RewriteCond读取特殊字符?

时间:2019-04-05 11:21:18

标签: .htaccess mod-rewrite

我正在尝试获得符合SEO要求的干净网址。 我在网站上使用的控制面板已经允许在其核心设置内简单地激活清理网址。这只是相应地更改了所有内部链接,仅此而已。 所以我现在想在这里做的就是在.htaccess文件中设置正确的RewriteRule设置

这就是我能想到的:

.htaccess的特定设置如下:

JNIEXPORT void JNICALL Java_classes_classes_fun
      (JNIEnv *env, jobject thiz, jstring path){

   const char *nativePath = (*env)->GetStringUTFChars(env, path, 0);

   // use your string as usual

   (*env)->ReleaseStringUTFChars(env, path, nativePath);
}

有效的真实地址:

RewriteRule ^(\w+)/?$ ?module=$1 RewriteRule ^(\w+)/(\w+)/?$ ?module=$1&action=$2 RewriteRule ^(\w+)/(\w+)/\?id=(\w+)$ ?module=$1&action=$2&id=$3 [L]

激活Clean URL后,它将变为:

https://example.com/?module=character&action=view&id=500001

使用当前的.htaccess设置,如上所示 https://example.com/character/view/?id=500001可以正常工作 而之后的所有内容均无法正常运行。 (?id = 500001)

我尝试使用上一个RewriteRule正确读取?id =,但未能使其正常工作。我可能会误会我如何在RewriteRule(在这种情况下为问号)中写入特殊字符。

曾经阅读过一些指南和信息页面,但并没有完全了解我的想法,因为我从未发现过有关特殊字符的信息。

直接或在方括号内输入似乎也没有达到要求的结果。

希望对这个最可能出现的愚蠢问题有所启发。

谢谢

1 个答案:

答案 0 :(得分:0)

第一个之后的所有内容? URL中的“字符串”被视为GET查询字符串,因此,不是RewriteRule模式所匹配的字符串的一部分。您可以为此使用RewriteCond,但是仍然存在疑问,因为您使用的此类URL在大多数人称为“ SEO友好”的意义上来说并不干净。

RewriteEngine on
RewriteRule ^/?(\w+)/?$ /?module=$1 [END]
RewriteRule ^/?(\w+)/(\w+)/?$ /?module=$1&action=$2 [END]
RewriteCond %{QUERY_STRING} (?:^|&)id=(\d+)(?:&|$)
RewriteRule ^/?(\w+)/(\w+)/?$ /?module=$1&action=$2&id=%1 [END]

您的网址应改为https://example.com/character/view/500001,以简化操作:

RewriteEngine on
RewriteRule ^/?(\w+)/?$ ?module=$1 [END]
RewriteRule ^/?(\w+)/(\w+)/?$ ?module=$1&action=$2 [END]
RewriteRule ^/?(\w+)/(\w+)/(\d+)$ ?module=$1&action=$2&id=$3 [END]

如果使用上述规则收到内部服务器错误(http状态500),则很可能是您运行了非常旧版本的apache http服务器。在这种情况下,您将在http服务器错误日志文件中看到对不支持的[END]标志的明确提示。您可以尝试升级或使用旧的[L]标志,在这种情况下它可能会起作用,尽管这在一定程度上取决于您的设置。

这些规则将在http服务器主机配置或动态配置文件(“ .htaccess”文件)中同样起作用。显然,重写模块需要加载到http服务器内部并在http主机中启用。如果使用动态配置文件,则需要注意在主机配置中完全启用了它的解释,并且该解释位于主机的DOCUMENT_ROOT文件夹中。

还有一个一般性说明:您应该始终喜欢将此类规则放置在http服务器主机配置中,而不要使用动态配置文件(“ .htaccess”)。这些动态配置文件增加了复杂性,通常是导致意外行为,难以调试的原因,并且确实降低了http服务器的速度。仅当您无法访问真正的http服务器主机配置(阅读:真正便宜的服务提供商)或坚持编写自己的规则的应用程序(这显然是安全的噩梦)时,才提供它们作为最后的选择。


哦,顺便说一句:

没有“特殊字符”之类的东西,不要再表现好坏字符了。只有字符。今天的标准是Unicode或至少是UTF-8。该编码定义了大约108000个字符,所有这些字符均有效且正常,均不属于“特殊”字符。 ;-)