我想要以下规则,但我似乎没有得到正确的设置。
<domain>/training-courses/
最后有或没有斜线,它应该去:
<domain>/?index.php?page=training-courses
并且对于每个变量之后我希望它的行为如下:
<domain>/training-courses/success/another-value/and-yet-another/
到
<domain>/?index.php?page=training-courses&val1=success&val2=another-value&val3=and-yet-another-value
如果无法选择无限制的前导变量,我想在页面变量之后至少有2个变量
这可能吗?以及如何解决这个问题?
到目前为止,我有这个:
RewriteEngine On
RewriteRule ^test/([^/]*)/$ /test/index.php?pagina=$1&val1=$2
RewriteRule ^test/([^/]*)$ /test/index.php?pagina=$1&val1=$2
RewriteRule ^test/([^/]*)/([^/]*)/$ /test/index.php?pagina=$1&val1=$2
RewriteRule ^test/([^/]*)/([^/]*)$ /test/index.php?pagina=$1&val1=$2
RewriteRule ^test/([^/]*)/([^/]*)/([^/]*)/$ /test/index.php?pagina=$1&val1=$2&val2=$3
RewriteRule ^test/([^/]*)/([^/]*)/([^/]*)$ /test/index.php?pagina=$1&val1=$2&val2=$3
答案 0 :(得分:0)
你是完全正确的,你不能以你想要的方式处理无限量的子文件夹,mod_rewrite只是不支持它。
但是,为了解决您的第一个问题,要进行尾随/可选,请将规则更改为以下内容:
RewriteRule ^test/([^/]*)/?$ /test/index.php?pagina=$1
RewriteRule ^test/([^/]*)/([^/]*)/?$ /test/index.php?pagina=$1&val1=$2
RewriteRule ^test/([^/]*)/([^/]*)/([^/]*)/?$ /test/index.php?pagina=$1&val1=$2&val2=$3
答案 1 :(得分:0)
经过数小时和数小时的碾压之后,它才会起作用。由于不支持无限变量,我可以使用除页面之外的两个变量(pagina)。我现在拥有的是:
RewriteEngine On
RewriteRule ^(test/images|test/css|test/js|test/lib)($|/) - [L]
RewriteRule ^test/(.*)/(.*)/(.*)/ test/index.php?pagina=$1&e=$2&t=$3
RewriteRule ^test/(.*)/(.*)/(.*) test/index.php?pagina=$1&e=$2&t=$3
RewriteRule ^test/(.*)/(.*)/ test/index.php?pagina=$1&e=$2
RewriteRule ^test/(.*)/(.*) test/index.php?pagina=$1&e=$2
RewriteRule ^test/(.*)/ test/index.php?pagina=$1
RewriteRule ^test/(.*) test/index.php?pagina=$1
RewriteRules的无工作除了第一个从其他rewriterules中排除文件夹的工作。通过工作我的意思是它实际上将URL重定向到index.php,但我不能通过$ _GET ['pagina']
获取PHP中的值奇怪的是,这将是有效的,尽管我的喜好太有限了:
RewriteEngine On
RewriteRule ^(test/images|test/css|test/js|test/lib)($|/) - [L]
RewriteRule ^test/(.*)/ test/index.php?pagina=$1
答案 2 :(得分:0)
我想回到我自己的问题并回答它。有一段时间我正在使用我想要的东西。
首先我在我的htaccess中有这个:
<IfModule mod_rewrite.c>
RewriteEngine On
# existing folders or files
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.* - [L]
# non-existing folders or files
RewriteRule ^(.*)/? index.php?p=$1 [L]
</IfModule>
这允许始终访问真实文件。如果路径不存在,它将把整个路径传递给index.php。
在index.php中,我在顶部有以下代码:
// Split the URL in all its components
$request = parse_url(strip_tags($_GET['p']));
// Only take the path without any leading slashes
$path = rtrim($request['path'], '/');
// Split each variable from eachother
$path_array = explode("/", $path);
if(count($path_array)){
// By default I select the first variable as the page I will include later on
$page = $path_array[0];
// Each other variable I will pass as $val[#nr] starting with 1. Just to be sure I'm going to strip tags and slashes
for($i=1;$i<count($path_array);$i++){
$path_array[$i] = strip_tags($path_array[$i]);
$path_array[$i] = stripslashes($path_array[$i]);
$val[$i] = $path_array[$i];
}
}
else{
// If $path_array doesn't contain multiple variables lets assume $path will contain the $page
$page = $path;
}
// If $page is empty let's take on the default page to include later on
if(empty($page)){
$page = "home";
}
if(file_exists($page . ".php")){
include($page . ".php");
}
else{
echo "Page " . $page . ".php does not exist.";
}
给你一些可能性的例子:
domain.com/将包含home.php domain.com/product/将包含product.php domain.com/product/298833/将包含product.php并解析298833为$ val [1]; domain.com/product/298833/purple-candle将包含product.php并解析为298833 $ val [1];和紫色蜡烛为$ val [2];注意没有包含前导斜杠。没关系。
我愿意接受改进或提示。现在,当我提出这个问题时,这肯定是我正在寻找的答案。