apache mod_rewrite查询字符串到规范URL

时间:2017-05-10 15:41:19

标签: php apache .htaccess mod-rewrite

我想要一个URL,它给我一个查询字符串,其中包含给定顺序的输入,并以规范格式放置查询字符串的值。例如......

www.example.com/?name=me&value=you&where=here

变为

www.example.com/Connects/me/you/here

我尝试了一些mod_rewrites但是我很难让它工作。我不知道如何查询基本URL之后的查询 - 也许我不必做任何事情。无论如何,这是我尝试过的事情之一。

RewriteCond %{QUERY_STRING}
RewriteRule ^/ /Connects/%1/%2/%3/%4/%5/%6 [L]

4 个答案:

答案 0 :(得分:0)

不确定我是否理解得很好,但就是这样:

RewriteRule ^Connects/([^/]+)/([^/]+)/([^/]+)$ /?name=$1&value=$2&where=$3 [L]

答案 1 :(得分:0)

您需要匹配查询字符串本身:

RewriteEngine On
RewriteCond %{QUERY_STRING} ^name=(\w+)&value=(\w+)&where=(\w+)
RewriteRule .* /Connects/%1/%2/%3? [L]

...虽然如果您的规范网址重新映射到具有这些参数的实际网页,您最终可能会以无限递归的方式结束 - 请小心!

答案 2 :(得分:0)

这是不好的做法。你的路由规则必须在php文件中,而不是在htaccess中。

.htaccess文件

<IfModule mod_rewrite.c>
    Options -MultiViews
    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

的index.php

<?php
# /Connects/me/you/here
$uri = $_SERVER['REQUEST_URI'];

$parts = explode('/', $uri);
// Array(0=>'', 1=>'Connects', 2=>'me', 3=>'you', 3=>'here')

if( '/Connects/me/you/here' === $uri ) {
    echo "Connects page!";
}

if( '/home' === $uri ) {
    echo "Home!";
}

框架使用Routes来捕获REQUEST_URI结构并为此路由调用Controller或Closure函数。

答案 3 :(得分:0)

您可能想要重新解释这个问题,因为您似乎在询问SEO-Friendly URLs,但使用的术语“规范”是指consolidation of URLs for SEO purposes.

顺便说一句,从第一个链接开始,您可以找到您可能想要使用的“捕获”功能。

Options +FollowSymLinks

RewriteEngine On
RewriteRule ^products/([a-zA-Z]+)/([0-9]+)/$ index.php?product=$1&price=$2

此“捕获”功能是您想要使用的功能。

所以,对于

www.example.com/?name=me&value=you&where=here

你想要像这样捕捉:

www.example.com/?name=$1&value=$2&where=$3

然后,使用括号输出这些捕获。

RewriteRule ^Connects/([a-zA-Z]+)/([a-zA-Z]+)/([a-zA-Z]+)$ www.example.com/?name=$1&value=$2&where=$3

值得注意的是,我将此格式化为假设您只希望这些是字母字符。您需要根据可以接受的值进行自定义。