Jim*_*myJ 11 regex apache mod-rewrite
我正在建立一个相当大的网站,我的.htaccess开始感觉有点膨胀,有没有办法取代我现有的系统 - 每个可能通过的可能数量的变量的一个规则,一个捕获所有可以解释不同数量输入的表达式?
例如,我目前有:
RewriteRule ^([a-z]+)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /index.php?mode=$1&id=$2&$3=$4&$5=$6
RewriteRule ^([a-z]+)/([^/]*)/([^/]*)/([^/]*)$ /index.php?mode=$1&id=$2&$3=$4
RewriteRule ^([a-z]+)/([^/]*)$ /index.php?mode=$1&id=$2
RewriteRule ^([a-z]+)$ /index.php?mode=$1
Run Code Online (Sandbox Code Playgroud)
第一个反向引用始终是模式,并且(如果存在的话)第二个反向引用总是id,此后任何进一步的反向引用在输入的名称和它的值之间交替
http://www.example.com/search
http://www.example.com/search/3039/sort_by/name_asc/page/23
Run Code Online (Sandbox Code Playgroud)
我希望能够有一个表达式来优雅地处理所有输入.
像Drupal一样:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
Run Code Online (Sandbox Code Playgroud)
然后使用像这样的PHP代码处理脚本中的所有内容
$pathmap = ();
if ($_GET["q"]){
$path = split("/", $_GET["q"]);
for ($i=0; $i+1<count($path); $i++){
$pathmap[$path[$i]] = $path[$i+1];
$i++;
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道是否可以使用单个表达式完成,但无论查询字符串有多长,都可以使用固定数量的表达式完成.
您的mod_rewrite规则将被重复调用,为您提供有时称为mod_rewrite递归的内容.有避免它的技术,但我认为你想使用它.
设置一个规则,用name = value&替换最后一对
继续将输入查询字符串添加到输出.每次通过,您的查询字符串将变得更长,您的URL将变得更短.
最终,您只有一个与上一个规则匹配的值.
您必须使用捕获查询字符串
RewriteCond %{QUERY_STRING} ^(.*)$
Run Code Online (Sandbox Code Playgroud)
然后使用%1将其添加回输出
你最终会得到四条线.
我知道您开始使用四行,但您可以根据需要匹配任意数量的参数,而无需添加第五行.
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*/)([^/]+)/([^/]+) $1?$2=$3&%1 [L]
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^([^/]+)/ $1.php?%1 [L]
Run Code Online (Sandbox Code Playgroud)
这将重写以下内容
/mypage/param1/val1/param2/val2/param3/val3/... --->
/mypage.php?param1=val1¶m2=val2¶m3=val3&...
Run Code Online (Sandbox Code Playgroud)
当只剩下一个参数时停止.它将采用第一个"参数"并使用该名称调用.php文件.param/val对的数量没有限制.
| 归档时间: |
|
| 查看次数: |
2366 次 |
| 最近记录: |