.htaccess 网址%20显示404错误代码,如何修复?

mw3dktmi  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(203)

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

我该如何解决这个问题?

amrnrhlw

amrnrhlw1#

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 * 模式 * 与%解码的URL路径匹配。%20是一个编码为 * 空格 * 的URL,因此此正则表达式必须与文字 * 空格 * 字符匹配。
\s速记字符类别表示任何空白字符。
在字符类的最后一个连字符之前,你有一个错误的-z字符序列。当在字符类的开头或结尾使用连字符时,不需要反斜杠转义。
您还应该在此处包括L标志。

更新日期:

网站正在跳转,请点击这里
点现在可能会导致与其他规则(例如,前端控制器模式)的冲突,因为它现在可能会匹配实际文件,如index.php
对于以.php结尾的搜索短语,您可以使用负的lookahead作为例外,例如:^(?!.+\.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]

NB:您在修订后的规则中有search_maiin.php(两个i)(我认为这是一个打字错误)?

更新#2:

我直接请求[index.php]。
我不希望您直接请求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:

如何匹配和登录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

我们能允许表情符号吗?
与其专注于不断增加的字符类型,它可能更容易只关注字符,你不想要的,如斜线。
要匹配除斜杠以外的所有内容(即由单个路径段组成的URL),请将RewriteRule指令更改为:

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

[^/]是一个 negated 字符类,它匹配除斜杠以外的任何字符。

相关问题