下面是我的.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
我该如何解决这个问题?
1条答案
按热度按时间amrnrhlw1#
第一个规则中的
RewriteRule
* 模式 * 不允许使用 * 空格 *。请尝试以下操作:RewriteRule
* 模式 * 与%解码的URL路径匹配。%20
是一个编码为 * 空格 * 的URL,因此此正则表达式必须与文字 * 空格 * 字符匹配。\s
速记字符类别表示任何空白字符。在字符类的最后一个连字符之前,你有一个错误的
-z
字符序列。当在字符类的开头或结尾使用连字符时,不需要反斜杠转义。您还应该在此处包括
L
标志。更新日期:
网站正在跳转,请点击这里
点现在可能会导致与其他规则(例如,前端控制器模式)的冲突,因为它现在可能会匹配实际文件,如
index.php
。对于以
.php
结尾的搜索短语,您可以使用负的lookahead作为例外,例如:^(?!.+\.php$)([a-zA-Z0-9:.–\s-]+)/?$
。换句话说:或者,确定规则只适用于初始要求,而不适用于重新写入的要求。例如:
NB:您在修订后的规则中有
search_maiin.php
(两个i
)(我认为这是一个打字错误)?更新#2:
我直接请求[index.php]。
我不希望您直接请求
index.php
,这确实会与上述规则产生冲突,因为对index.php
(或任何直接请求的.php
文件)的请求将被路由到search_main.php
。请尝试以下方法,明确排除对物理文件(和目录)的请求:
更新#3:
如何匹配和登录url?
/MP3:%20Quavo%20&%20Takeoff%20%E2%80%93%20Nothing%20Changed
将
&
添加到正则表达式字符类(中间)--这个字符在正则表达式中没有特殊含义。但是,您可能还需要将B
标志添加到该规则中,这样&
在查询字符串中是URL编码的,而不是查询字符串中的URL参数分隔符。例如:
更新#4
我们能允许表情符号吗?
与其专注于不断增加的字符类型,它可能更容易只关注字符,你不想要的,如斜线。
要匹配除斜杠以外的所有内容(即由单个路径段组成的URL),请将
RewriteRule
指令更改为:[^/]
是一个 negated 字符类,它匹配除斜杠以外的任何字符。