【问题标题】:htaccess URL Rewrite with and without query string使用和不使用查询字符串的 htaccess URL 重写
【发布时间】:2014-11-06 16:11:18
【问题描述】:

我正在尝试重写一些 url,但我的新手阻碍了。

地址栏输入的网址

example.com/prefix-suffix.html
example.com/prefix-suffix.html?v=huzzah

期望的输出(希望它们显示的样子)

example.com/prefix/suffix/
example.com/prefix/suffix/huzzah

我查看了一些其他示例 like this one,但我只是不明白它们到底在做什么或如何做,这使得修改起来很困难。

如果您有时间解释每一行的作用,我会非常感谢

谢谢。

【问题讨论】:

    标签: regex apache .htaccess mod-rewrite redirect


    【解决方案1】:

    您可以在 DOCUMENT_ROOT/.htaccess 文件中使用此代码:

    RewriteEngine On
    RewriteBase /
    
    RewriteCond %{THE_REQUEST} \s/+([^-]+)-([^.]+)\.html\s [NC]
    RewriteRule ^ /%1/%2/ [R=302,L,NE]
    
    RewriteCond %{THE_REQUEST} \s/+([^-]+)-([^.]+)\.html\?v=([^\s&]+) [NC]
    RewriteRule ^ /%1/%2/%3? [R=302,L,NE]
    
    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ - [L]
    
    RewriteRule ^([^/]+)/([^/]+)/?$ /$1-$2.html [L]
    
    RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ /$1-$2.html?v=$3 [L,QSA]
    

    【讨论】:

    • 嗯。这似乎根本没有改变网址。不知道为什么。
    • 您在浏览器中输入的网址是什么?你想在浏览器中看到example.com/prefix-suffix.html?v=huzzah还是在浏览器中看到example.com/prefix/suffix/huzzah
    • 最终结果是我想在浏览器中看到example.com/prefix/suffix/huzzah
    • 好的,我会编辑的。同时,如果您在浏览器中输入example.com/prefix/suffix/huzzah,此规则是否会显示来自example.com/prefix-suffix.html?v=huzzah 的正确内容?
    • 谢谢。效果很好。我希望我能更了解它。 :)
    【解决方案2】:

    this 是一个很好的参考。总结相关部分:

    在您所指的 SO 问题中,OP 希望 index.php?page=mobile 成为 index/page/mobile

    该问题的公认答案是:

    RewriteEngine on
    RewriteBase /cashearn/
    
    RewriteCond %{THE_REQUEST} /index\.php\?page=([^\s&]+) [NC]
    RewriteRule ^ index/page/%1? [R=302,L]
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^index/page/([^/]+)/?$ index.php?page=$1 [L,QSA,NC]
    



    为了了解它是如何工作的,让我们仔细看看这个部分:

    RewriteCond %{THE_REQUEST} /index\.php\?page=([^\s&]+) [NC]
    RewriteRule ^ index/page/%1? [R=302,L]
    

    RewriteCond 是一个条件,必须匹配才能使用后续的 RewriteRule。 模式匹配是使用正则表达式完成的。基础知识很容易掌握,所以我建议你查一下。在任何情况下,%N 形式的任何内容(例如%1)都是对 current 条件集中最后一个 RewriteCond 模式的“分组”部分的反向引用。 “分组”部分由括号表示。换句话说,RewriteRule 中的%1 指的是 RewriteCond 中的([^\s&]+)

    查看正则表达式:
    正则表达式中的方括号表示一个字符类,因此[^\s&] 是一个字符类。 插入符号^inside 中时,字符类表示否定。 \s 是空白字符的转义码。所以,总而言之,[^\s&] 的意思是“除空格和& 之外的任何字符”。字符类附加了+,意思是“一个或多个”。因此,正则表达式模式将匹配字符类中包含的字符之一。对于 url,这本质上是指字母、数字和% 的任意组合。

    RewriteRule 和 RewriteCond 中的其他字符,除了“服务器变量”%{THE_REQUEST},要么是正则表达式特殊字符,要么是文字。 (通过文字,我的意思是正则表达式中的 ab 将匹配字符串 cab。)

    ^,插入符号,当它不在字符类中时,是一个特殊字符,表示一行的开头。请注意 ?. 在这里也是文字,尽管它们包含在正则表达式“特殊字符”列表中。那是因为他们被\ 转义了。

    唯一需要解释的是标志[NC][R=302,L]
    NC 表示不区分大小写。 L 表示最后一个,即如果匹配,则后续规则将处理。 'R' 表示“重定向”,302 是重定向的 HTTP 状态代码。

    内部和外部重定向之间的区别在这里是相关的。使用内部重定向,服务器将默默地从新形成的 URL 指定的文件路径中获取资源,而用户仍然在浏览器中看到原始 URL。 R 标志表示外部重定向,这会导致用户使用新形成的 URL 启动新的 HTTP 事务。省略 R 进行内部重定向。

    【讨论】:

    • 非常感谢您花时间解释所有这些。我非常感激。 :)
    猜你喜欢
    • 1970-01-01
    • 2012-11-15
    • 2016-02-13
    • 2020-06-04
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    相关资源
    最近更新 更多