regex - 带有 %20 的 URL 显示 404 错误代码,如何解决?

标签 regex apache .htaccess mod-rewrite url-rewriting

下面是我的 .htaccess 规则,第一个规则是针对 example.com/search-words 但是当你像这样到达它时显示 404 错误代码 example.com/search%20words 而第二条规则 example.com/s/search-words 在两者中都有效。

RewriteRule ^([a-zA-Z0-9-z\-]+)/?$ search_main.php?q=$1
RewriteRule ^s/(.*)?$ search_main.php?q=$1

我该如何解决这个问题?

最佳答案

RewriteRule ^([a-zA-Z0-9-z\-]+)/?$ search_main.php?q=$1

第一个规则中的RewriteRule 模式 不允许空格。请尝试以下操作:

RewriteRule ^([a-zA-Z0-9\s-]+)/?$ search_main.php?q=$1 [L]

RewriteRule pattern 匹配 %-decoded URL 路径。 %20 是一个 URL 编码的空格,所以这个正则表达式必须匹配文字 空格 字符。

\s 简写字符类表示任何空白字符。

您在字符类中的最后一个连字符之前有一个错误的 -z 字符序列。在字符类的开头或结尾使用时,无需反斜杠转义文字连字符。

您还应该在此处包括 L 标志。


更新:

RewriteRule ^([a-zA-Z0-9:.–\s-]+)/?$ search_maiin.php?q=$1 [L] Dot is redirecting home page to index.php @MrWhite

点现在可能会导致与其他规则(例如前端 Controller 模式)的冲突,因为它现在可能会匹配实际文件,例如 index.php

您可以对以 .php 结尾的搜索短语进行异常(exception)处理,例如使用否定前瞻:^(?!.+\.php$)([a-zA -Z0-9:.–\s-]+)/?$。换句话说:

RewriteRule ^(?!.+\.php$)([a-zA-Z0-9:.–\s-]+)/?$ search_main.php?q=$1 [L]

或者,确保该规则仅适用于初始请求而不适用于重写的请求。例如:

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^([a-zA-Z0-9:.–\s-]+)/?$ search_main.php?q=$1 [L]

注意:您的修订规则中有 search_maiin.php(两个 i)(我认为这是错字)?


更新#2:

I'm requesting [index.php] directly.

我不希望您直接请求 index.php。这确实会与上述规则产生冲突,因为对 index.php 的请求(或任何直接请求的 .php 文件)将被路由到 search_main.php.

改为尝试以下操作,以专门排除对物理文件(和目录)的请求:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9:.–\s-]+)/?$ search_main.php?q=$1 [L]

更新#3:

how do I match & sign in url? /MP3:%20Quavo%20&%20Takeoff%20%E2%80%93%20Nothing%20Changed

& 添加到正则表达式字符类的(中间)- 此字符在正则表达式中没有特殊含义。但是,您可能还需要向该规则添加 B 标志,以便 & 在查询字符串中进行 URL 编码,而不是在查询字符串中被视为 URL 参数定界符查询字符串。

例如:

:
RewriteRule ^([a-zA-Z0-9:.–&\s-]+)/?$ search_main.php?q=$1 [B,L]

更新#4

can we also allow emoji?

与其专注于允许的不断增加的字符类型,不如专注于您不想要的字符,例如。斜杠。

要匹配除斜杠以外的所有内容(即由单个路径段组成的 URL),然后将 RewriteRule 指令更改为:

:
RewriteRule ^([^/]+)/?$ search_main.php?q=$1 [B,L]

[^/] 是一个否定字符类,它匹配除斜线以外的任何内容。

关于regex - 带有 %20 的 URL 显示 404 错误代码,如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73989290/

相关文章:

c++ - C++ 11中带有选项R的正则表达式

PHP代码没有被执行,但代码显示在浏览器源代码中

php - 在 Apache 服务器上将特定的 .htm 页面处理为 .php

.htaccess 重定向域别名'

c++ - 使用带有 char * 的正则表达式迭代器

java - 正则表达式只允许两者中的一种模式

apache - Tomcat 服务器导致大负载的管道损坏

apache - 配置只允许特定域使用 .htaccess 访问某些文件夹

php - 在被黑网站中隐藏重定向?

javascript - javascript正则表达式-用一个替换所有实例