.htaccess复杂重写规则

时间:2019-03-19 11:12:16

标签: regex apache .htaccess url-rewriting

我有一个稍微复杂的重写规则,我无法理解。

我想做的是使用.htaccess使我的网站看到此链接:

https://some-domain.com/human/jeff

作为此链接(因为系统知道如何处理此链接):

https://some-domain.com/?type=human&which=jeff

注释:

  1. 我只想在type=human上应用此规则。
  2. which参数只能包含字母字符。
  3. 如果类型是人类,则除了这些URL参数之外,不会再有其他URL参数。

经过大量尝试后,这是我最终的和失败的.htaccess内容:

RewriteEngine On    
RewriteRule     ^(https://[^/]+)/?\?type=(human)&which=([a-zA-z]+)$ $1/$2/$3 [NC, L]

这是背后的逻辑:

  • 第1组:(https://[^/]+) $ 1将包含与https://{any non empty string that does not containing "/"}-https://some-domain.com
  • 匹配的任何字符串
  • 静态:/?\?匹配“ /?”或“?”
  • 第2组:type=(human) $ 2将包含“人类”
  • 第3组:which=([a-zA-z]+) $ 3将包含一个只有字母字符(jeff)的非空字符串。

预期结果:
这将匹配正则表达式

https://{any non empty string that does not containing "/"}/human/{any non empty string}

我几乎被困在这里

谢谢!

编辑:
我还应该提到,重写仅应用于POST请求,并且需要post参数。

3 个答案:

答案 0 :(得分:1)

尝试以下模式:^(https?:\/\/[^\/]+\/)\?type=(human)&which=([a-z]+)$

^-字符串的开头

https?:\/\/[^\/]+\/-逐字匹配http,然后可选地匹配s(零或一个),\/\/逐字匹配//[^\/]+匹配超过/个字符,然后从字面上匹配/

\?type=(human)&which=([a-z]+)-从字面上匹配?,然后从字面上匹配type=humanhuman将存储在捕获组中),然后从字面上匹配&which=,然后匹配一个或多个带有[a-z]

的字母

以理想的形式(type=human并且只有which中的字母)与您的字符串匹配。

替换模式:\1\2\/\3

\1-替换为第一个捕获组,分别替换为\2\3

Demo

答案 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 / {任何非空字符串}

时,此规则才适用