下面是我的 .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/