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)
我该如何解决?
\n\nRun Code Online (Sandbox Code Playgroud)\nRewriteRule ^([a-zA-Z0-9-z\\-]+)/?$ search_main.php?q=$1\n
RewriteRule
第一条规则中的模式不允许空格。请尝试以下方法:
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,因此此正则表达式必须匹配文本空格字符。
速记\\s
字符类表示任何空白字符。
-z
在字符类中最后一个连字符之前有一个错误的字符序列。当在字符类的开头或结尾使用连字符时,无需反斜杠转义文字连字符。
您还应该L
在此处包含该标志。
更新:
\n\n\n\n
RewriteRule ^([a-zA-Z0-9:.\xe2\x80\x93\\s-]+)/?$ search_maiin.php?q=$1 [L]
Dot 正在将主页重定向到 index.php @MrWhite
该点现在可能会导致与其他规则(例如前端控制器模式)发生冲突,因为它现在可能会匹配实际文件,例如index.php
.
您可以对以 结尾的搜索短语进行例外处理.php
,使用否定前瞻,例如:^(?!.+\\.php$)([a-zA-Z0-9:.\xe2\x80\x93\\s-]+)/?$
。换句话说:
RewriteRule ^(?!.+\\.php$)([a-zA-Z0-9:.\xe2\x80\x93\\s-]+)/?$ search_main.php?q=$1 [L]\n
Run Code Online (Sandbox Code Playgroud)\n或者,确保规则仅适用于初始请求,而不适用于重写的请求。例如:
\nRewriteCond %{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
)(我认为这是一个拼写错误)?
更新#2:
\n\n\n我直接请求[index.php]。
\n
我不希望你直接提出请求index.php
。这确实会与上述规则产生冲突,因为对index.php
(或.php
直接请求的任何文件)的请求将被路由到search_main.php
.
请尝试以下操作,以专门排除对物理文件(和目录)的请求:
\nRewriteCond %{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更新#3:
\n\n\n如何匹配并登录网址?
\n/MP3:%20Quavo%20&%20Takeoff%20%E2%80%93%20Nothing%20Changed
添加&
到正则表达式字符类(中间) - 该字符在正则表达式中没有特殊含义。但是,您可能还需要B
向该规则添加该标志,以便&
在查询字符串中对它进行 URL 编码,并且在查询字符串中不会将其视为 URL 参数分隔符。
例如:
\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更新#4
\n\n\n我们也可以允许使用表情符号吗?
\n
与其专注于不断增加的允许的字符类型,不如专注于您不想要的字符,例如。斜线。
\n要匹配除斜杠之外的所有内容(即由单个路径段组成的 URL),请将指令更改为RewriteRule
:
:\nRewriteRule ^([^/]+)/?$ search_main.php?q=$1 [B,L]\n
Run Code Online (Sandbox Code Playgroud)\n[^/]
是一个否定字符类,匹配除斜杠之外的任何内容。