【问题标题】:Rewriting url with one parameter out of multiple parameters in .htaccess用.htaccess中多个参数中的一个参数重写url
【发布时间】:2013-11-25 13:19:22
【问题描述】:

我在 htaccess 文件中有下一行:

RewriteCond %{QUERY_STRING} (^|&)grp=([0-9]+)(&|$)
RewriteCond %{QUERY_STRING} (^|&)level=([0-9]+)(&|$) 
RewriteRule ^alpe-adria/([a-zA-Z0-9_-]+)$ /site/index.php?d=1&box=1&grp=%1&grpname=$1&level=%2 [L]

原来的网址有这样的代码:

/site/index.php?d=1&box=1&grp=13&grpname=art-culture&level=1

参数dbox是固定的,其他参数grpgrpnamelevel因页面而异。我想要做的是把这个 URL 改写成这样的状态:

/alpe-adria/art-culture

所以问题是,如何挑出grpname 参数并同时使用所有其他参数,其中两个不固定。我尝试了两个 RewriteCond %{QUERY_STRING} 规则但没有成功。想法是挑出两个参数,然后在原始 URL 中使用它们。另一方面,在原始 URL 中使用一个参数,就像在替代 URL 中一样。再次,我被困住了,我需要你的宝贵帮助。

整个sn-p:

<IfModule mod_rewrite.c>
RewriteEngine on

RewriteCond %{QUERY_STRING} box=
RewriteRule ^alpe-adria$ /site/index.php [L]

RewriteCond %{QUERY_STRING} d=
RewriteRule ^alpe-adria$ /site/index.php [L]

RewriteCond %{QUERY_STRING} op=
RewriteRule ^alpe-adria$ /site/index.php [L]

RewriteCond %{QUERY_STRING} masterSearch=
RewriteRule ^alpe-adria$ /site/index.php [L]

RewriteCond %{QUERY_STRING} ^$
RewriteRule ^alpe-adria/?$ /site/index.php?box=1&d=3 [L]

RewriteCond %{QUERY_STRING} (?:|.*&)grpname=([^&]*)
RewriteRule ^site/index\.php$ /alpe-adria/%1? [L,R]

【问题讨论】:

    标签: php regex apache .htaccess mod-rewrite


    【解决方案1】:

    你的问题不是很清楚,但你可以使用这样的规则,让你从查询字符串的任何地方捕获所有这些parameters grp, grpname and level

    RewriteEngine on
    
    RewriteCond %{THE_REQUEST} \s/+site/index\.php\?d=1&box=1&grp=([^&]*)&grpname=([^&]*)&level=([^&]*) [NC]
    RewriteRule ^ /alpe-adria/%2/%1/%3? [L,NE,R=302]
    
    RewriteRule ^alpe-adria/([^/]+)/([^/]+)/([^/]+)/?$ /site/index.php?d=1&box=1&grp=$2&grpname=$1&level=$3 [L,QSA]
    

    【讨论】:

    • 很好,但是是否可以在没有其他两个参数的情况下重定向到/alpe-adria/art-culture
    • 现在它显示 404 错误 - 找不到站点。也许是因为在这个 sn-p 之前我在 htaccess 中有更多代码。看看这个链接 - stackoverflow.com/questions/20067729/… - 在这个问题发生之前我问的问题。所以,我在 htaccess 文件中的整个 sn-p 是:
    • 上面已编辑问题,因为代码在 cmets 中看起来不太好
    • 好的,我想我现在明白了。您希望如何在内部处理/alpe-adria/art-culture?我相信它会是/site/index.php 和一些查询字符串。
    • 不,你不应该有那么多重写规则。但是为了避免这种情况,您在将内部重定向到漂亮的 URI 时不能丢失重要信息。目前是:/alpe-adria/art-culture,没有等级信息。理想情况下,你漂亮的 URI 方案应该是这样的:/alpe-adria/&lt;grp-name&gt;/&lt;grp-num&gt;/&lt;level&gt; 这足以在内部重写以在单个重写规则中更正 URI。
    【解决方案2】:

    真的有这样一个非 SEO 非 SEF URI 来自浏览器吗?将其转换为像“/alpe-adria/art-culture”这样的 SEF 形式有什么意义?除非您的新目录结构实际上是这样设置的,并且您正在尝试将旧的非 SEO/SEF URI 与新布局匹配。

    假设您实际上有传入的 '/alpe-adria/*' URI,您不会将原始 URL 重写为 /alpe-adria/art-culture。您正在使用 .htaccess 将/alpe-adria/art-culture(来自浏览器)重写为 PHP 和服务器可以消化的原始格式。请使用正确的术语。 .htaccess 对 出站 URI 没有任何作用。

    您是说/alpe-adria/ 是固定的,并且您有一个“搜索引擎友好”组名(例如,“艺术文化”)。您想将“艺术文化”映射到 index.php 的 URI 中吗?我看不到您从传入 URI 中的何处获取 grplevel 条目。您将能够做的最好的事情是有许多查找条目:匹配“艺术文化”,输出所需的完整 URI。匹配其他内容,输出不同的所需完整 URI。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 2020-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多