【问题标题】:Handle query parameters recursively using htaccess使用 htaccess 递归处理查询参数
【发布时间】:2012-03-18 16:34:29
【问题描述】:

我又来了,带着重写 URL 的查询 :(.
我正在使用 htaccess 进行重写,下面是我的 htaccess 代码:

RewriteEngine On
RewriteBase /

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

RewriteCond %{REQUEST_URI} !-f 
RewriteCond %{REQUEST_URI} !\.\w+$
RewriteCond %{REQUEST_URI} !/$ 
RewriteRule (.*) /$1/ [R,L]

RewriteCond %{REQUEST_URI} ^/([\w\d-]+)/$ [NC]
RewriteRule ^ /?file_name=%1 [L,QSA]

RewriteCond %{QUERY_STRING} !^$
RewriteCond %{QUERY_STRING} (?:(.*)&)?file_name=([\w\d-]+)(.*) [NC]
RewriteRule ^ %2/?%1%3 [L,R]

在询问我的问题之前,让我简要解释一下上述代码的工作原理。我有一个类似 http://www.mysite.com/ (for index) 的 URL,其他页面可以通过使用名为 file_name=page_name 的参数来执行,例如 http://www.mysite.com/?file_name=my_blog。我的 htaccess 正在帮助我排除 file_name 参数并创建一个新 URL,例如 http://www.mysite.com/my_blog/

现在我有一个问题:

  1. 现在已经有一个参数 file_name,现在我想提供额外的参数,例如 http://www.mysite.com/?file_name=my_blog&blog_alias=welcome-to-new -generation 并希望它看起来像 http://www.mysite.com/my_blog/welcome-to-new-generation/。因此,如果我添加任意数量的参数,则应删除参数名称,并且只有参数值带有斜杠。
    请注意:参数名称可以是任何值。

请帮忙。

【问题讨论】:

    标签: regex .htaccess mod-rewrite recursion url-rewriting


    【解决方案1】:

    这是一个非常有趣的问题,需要递归实现 mod_rewrite 规则。将此代码放在您的 .htaccess 中:

    更新 II 根据进一步的 cmets,将 /?file_name=my_blog&blog_alias=welcome-to-new-generation&foo=bar&n=v URI 重定向到 /file_name+my_blog/blog_alias+welcome-to-new-generation/foo+bar/n+v

    Options +FollowSymLinks -MultiViews
    # Turn mod_rewrite on
    RewriteEngine On
    RewriteBase /
    
    # forwards ?file_name=my_blog&blog_alias=welcome-to-new-generation to
    # /file_name=my_blog&blog_alias=welcome-to-new-generation
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+\?([^\s]+)\s [NC]
    RewriteRule ^$ %1? [L]
    
    # redirects /file_name=my_blog&blog_alias=welcome-to-new-generation&foo=bar&n=v
    # to /file_name+my_blog/blog_alias+welcome-to-new-generation/fo+barn+/v    
    RewriteRule ^(.*/)?([^=]+)=([^&]+)&(.*)$ $1$2+$3/$4 [L]
    RewriteRule ^(.*/)?([^=]+)=(.*)$ $1$2+$3 [L,R]
    
    # internal forward from /file_name+my_blog/blog_alias+welcome-to-new-generation to
    # /?file_name=my_blog&blog_alias=welcome-to-new-generation
    RewriteRule ^([^\+]+)\+([^/]+)/(.*)$ $3?$1=$2 [L,QSA]
    RewriteRule ^([^\+]+)\+([^/]+)/?$ /?$1=$2 [L,QSA]
    

    一旦您确定它正在工作,请将 R 更改为 R=301

    【讨论】:

    • 感谢您的回复,它重定向但显示 404 错误,我尝试打开 www.example.com/?file_name=my_blog 然后我收到此错误 /my_blog没有找到
    • 如果它重定向到/my_blog,那么它按照编码工作:) 根据您的问题,您想将http://www.mysite.com/?file_name=my_blog&blog_alias=welcome-to-new-generation 重定向到http://www.mysite.com/my_blog/welcome-to-new-generation/ 是不是正确的?
    • 或者您只是希望浏览器中的 URL 看起来像 http://www.mysite.com/my_blog/welcome-to-new-generation/ 但仍希望内部 URL 是 http://www.mysite.com/?file_name=my_blog&blog_alias=welcome-to-new-generation
    • 是的,你说得对,我只是想更改浏览器 URL,但想保留所有参数的内部 URL,这和 wordpress 一样。
    • 是的,我知道 Wordpress,因为我自己处理一些 Wordpress 安装。然而,现在试着了解这整个事情是如何运作的。在第一阶段,将有一个外部重定向example.com/?file_name=my_blogexample.com/my_blog。现在在第二阶段,您希望再次将内部转发到example.com/?file_name=my_blog。但是在第一阶段,由于我们丢失了参数名称file_name,因此只留下参数值,因此内部转发将没有可操作的信息。
    猜你喜欢
    • 2013-12-26
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    相关资源
    最近更新 更多