我有一个稍微复杂的重写规则,我无法理解。
我想做的是使用.htaccess使我的网站看到此链接:
https://some-domain.com/human/jeff
作为此链接(因为系统知道如何处理此链接):
https://some-domain.com/?type=human&which=jeff
注释:
type=human
上应用此规则。 which
参数只能包含字母字符。 经过大量尝试后,这是我最终的和失败的.htaccess内容:
RewriteEngine On
RewriteRule ^(https://[^/]+)/?\?type=(human)&which=([a-zA-z]+)$ $1/$2/$3 [NC, L]
这是背后的逻辑:
(https://[^/]+)
$ 1将包含与https://{any non empty string that does not containing "/"}
-https://some-domain.com /?\?
匹配“ /?”或“?” type=(human)
$ 2将包含“人类” which=([a-zA-z]+)
$ 3将包含一个只有字母字符(jeff)的非空字符串。预期结果:
这将匹配正则表达式
https://{any non empty string that does not containing "/"}/human/{any non empty string}
我几乎被困在这里
谢谢!
编辑:
我还应该提到,重写仅应用于POST请求,并且需要post参数。
答案 0 :(得分:1)
尝试以下模式:^(https?:\/\/[^\/]+\/)\?type=(human)&which=([a-z]+)$
^
-字符串的开头
https?:\/\/[^\/]+\/
-逐字匹配http
,然后可选地匹配s
(零或一个),\/\/
逐字匹配//
,[^\/]+
匹配超过/
个字符,然后从字面上匹配/
\?type=(human)&which=([a-z]+)
-从字面上匹配?
,然后从字面上匹配type=human
(human
将存储在捕获组中),然后从字面上匹配&which=
,然后匹配一个或多个带有[a-z]
以理想的形式(type=human
并且只有which
中的字母)与您的字符串匹配。
替换模式:\1\2\/\3
\1
-替换为第一个捕获组,分别替换为\2
和\3
答案 1 :(得分:1)
在这一行:
RewriteRule ^(https://[^/]+)/?\?type=(human)&which=([a-zA-z]+)$ $1/$2/$3 [NC, L]
这部分^(https://[^/]+)/?\?type=(human)&which=([a-zA-z]+)$
是pattern,应该与URI
匹配,但不能与完整的URL
匹配。
尝试一下:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^type=(human)&which=([A-Za-z]+)$ [NC]
RewriteRule ^ /%1/%2? [R=301,L]
RewriteRule ^(human)/(.*)$ /?type=$1&which=$2 [L]
注意:清除浏览器缓存,然后进行测试。
答案 2 :(得分:0)
感谢MichałTurczyn和Mohammed Elhag的帮助。
这是.htaccess的最终工作内容。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/(human)/([a-zA-Z]+)/?$ [NC]
RewriteRule ^(human)/(.*)$ /?type=$1&which=$2 [L]
</IfModule>
仅当REQUEST_URI为/ human / {任何非空字符串}
时,此规则才适用