带有 %20 的网址显示 404 错误代码,如何修复?

Zam*_*gue 3 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
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

MrW*_*ite 5

\n
RewriteRule ^([a-zA-Z0-9-z\\-]+)/?$ search_main.php?q=$1\n
Run Code Online (Sandbox Code Playgroud)\n
\n

RewriteRule 第一条规则中的模式不允许空格。请尝试以下方法:

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

RewriteRule 模式与 % 解码的 URL 路径相匹配。%20是 URL 编码的space,因此此正则表达式必须匹配文本空格字符。

\n

速记\\s字符类表示任何空白字符。

\n

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

\n

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

\n\n
\n

更新:

\n
\n

RewriteRule ^([a-zA-Z0-9:.\xe2\x80\x93\\s-]+)/?$ search_maiin.php?q=$1 [L]Dot 正在将主页重定向到 index.php @MrWhite

\n
\n

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

\n

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

\n
RewriteRule ^(?!.+\\.php$)([a-zA-Z0-9:.\xe2\x80\x93\\s-]+)/?$ search_main.php?q=$1 [L]\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
RewriteCond %{ENV:REDIRECT_STATUS} ^$\nRewriteRule ^([a-zA-Z0-9:.\xe2\x80\x93\\s-]+)/?$ search_main.php?q=$1 [L]\n
Run Code Online (Sandbox Code Playgroud)\n

注意:您修改后的规则中有search_maiin.php(两个i)(我认为这是一个拼写错误)?

\n
\n

更新#2:

\n
\n

我直接请求[index.php]。

\n
\n

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

\n

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

\n
RewriteCond %{REQUEST_FILENAME} !-f\nRewriteCond %{REQUEST_FILENAME} !-d\nRewriteRule ^([a-zA-Z0-9:.\xe2\x80\x93\\s-]+)/?$ search_main.php?q=$1 [L]\n
Run Code Online (Sandbox Code Playgroud)\n
\n

更新#3:

\n
\n

如何匹配并登录网址?/MP3:%20Quavo%20&%20Takeoff%20%E2%80%93%20Nothing%20Changed

\n
\n

添加&到正则表达式字符类(中间) - 该字符在正则表达式中没有特殊含义。但是,您可能还需要B向该规则添加该标志,以便&在查询字符串中对它进行 URL 编码,并且在查询字符串中不会将其视为 URL 参数分隔符。

\n

例如:

\n
:\nRewriteRule ^([a-zA-Z0-9:.\xe2\x80\x93&\\s-]+)/?$ search_main.php?q=$1 [B,L]\n
Run Code Online (Sandbox Code Playgroud)\n
\n

更新#4

\n
\n

我们也可以允许使用表情符号吗?

\n
\n

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

\n

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

\n
:\nRewriteRule ^([^/]+)/?$ search_main.php?q=$1 [B,L]\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n