Apache重写子目录URL内部重定向到查询字符串

时间:2018-04-18 10:20:04

标签: apache .htaccess url-rewriting

我想让apache重写表单中的所有链接:

host.com/links/<a>/<b>/<c>

如:

host.com/links/1/2/3

表格:

host.com/links/?a=1&b=2&c=3

我理解我需要将.htaccess与重写规则添加到links文件夹,但是并不真正理解重写规则的语法。

任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

根据此link

浏览器中的网址为:

private Player player;

public void executeEvents() {
    List<IEvent> events = ...;
    ProcessEventVisitor visitor = new ProcessEventVisitor();
    for (IEvent event : events) {
        event.accept(visitor);          
    }
}

服务器呈现的实际页面为:

host.com/links/1/2/3

添加到host.com/links/?a=1&b=2&c=3 这一行:

.htaccess
  

如果要重写更复杂的网址,则需要创建更多网址   复杂的正则表达式几乎任何模式都可以表达出来   作为一个正则表达式,如果你把它分解成小块。这个   正则表达式只分解为几个组成部分,一次   你过去盯着看似随意的角色:

RewriteEngine On
RewriteRule ^/links/([^/]+)/([^/]+)/([^/]+) /?a=$1&b=$2&c=$3 [PT]
  

上面的组件是一个包含&#34;而不是斜杠&#34;的字符类。   所以,如果我们这样做......

[^/]
  

表示&#34;零或多个非斜线字符&#34;。换句话说,我们是   寻找斜线之间的一切。有两套   这些,因为我们在斜线之间寻找两块东西。   有了这个小小的信息,请去看看常规   再次表达,看看它是否更有意义。和。一样   之前,我使用[PT]标志来指示目标URL不是   只是一个要服务的文件,但是需要的东西   处理。在这种情况下,它将成为一个cgi脚本处理程序。所以   Apache将生成的URL传递给该处理程序。

答案 1 :(得分:0)

重写规则的basci语法如下所示。

通过httpd.conf启用mod_rewrite和.htaccess,然后将此代码放在.htaccess目录下的DOCUMENT_ROOT

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} ^(demo)\.(.+)$ [NC]
RewriteRule ^(setup)/?$ http://www.%2/%1/$1 [L,R=301,NC]

RewriteCond %{HTTP_HOST} ^(demo)\.(.+)$ [NC]
RewriteRule ^(xyz)/?$ http://www.%2/%1/web/$1 [L,R=301,NC]

RewriteCond %{HTTP_HOST} !^demo\. [NC]
RewriteRule ^(xyz)/?$ /web/$1 [L,R=301,NC]

有关重写标志的更多信息

https://httpd.apache.org/docs/2.4/rewrite/flags.html https://httpd.apache.org/docs/2.4/rewrite/intro.html