htaccess URL使用和不使用查询字符串重写

时间:2014-11-06 16:11:19

标签: regex apache .htaccess mod-rewrite redirect

我试图重写一些网址,但我的新闻正在阻碍。

输入地址栏的网址

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

所需的输出(希望它们显示为)

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

我已经查看了其他几个例子like this one,但我只是不明白他们究竟在做什么,或者多么明确,这使得修改很有挑战性。

如果你有时间解释每一行的作用,我会非常欣赏它。

感谢。

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:1)

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)都是对"分组"的反向引用。 当前条件集中最后一个RewriteCond模式的一部分。 A"分组"部分用括号表示。换句话说,RewriteRule中的%1指的是RewriteCond中的([^\s&]+)

看着正则表达式:
正则表达式中的方括号表示字符类,因此[^\s&]是一个字符类。 插入符^当它在里面时,一个字符类表示否定。 \s是空格字符的转义码。总而言之,[^\s&]表示"除了空格和&"之外的任何字符。字符类附加+,表示"一个或多个"。因此,正则表达式模式将匹配字符类中包含的一个字符。对于网址,这实际上意味着字母,数字和%的任意组合。

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

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

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

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