2014-11-06 64 views
1

我想重写一些URL,但我的新手正在阻碍。htaccess 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,但我只是不了解他们正在做什么或如何做,这使得修改具有挑战性。

如果你有时间来解释每一行正在做什么,我会大大欣赏它。

谢谢。

回答

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] 
+0

嗯。这似乎并没有改变网址。不知道为什么。 – gin93r 2014-11-06 16:34:32

+0

你在浏览器中输入什么URL?你想在浏览器中看到'example.com/prefix-suffix.html?v = huzzah',还是想在浏览器中看到'example.com/prefix/suffix/huzzah'? – anubhava 2014-11-06 16:39:32

+0

最终结果是我想在浏览器中看到'example.com/prefix/suffix/huzzah'。 – gin93r 2014-11-06 16:42:45

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的模式的“分组”部分的反向引用。 “分组”部分用圆括号表示。换句话说,RewriteRule中的%1指的是RewriteCond中的([^\s&]+)

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

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

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

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

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

+0

的很好参考。非常感谢您花时间解释所有这些。我非常感谢。 :) – gin93r 2014-11-06 17:27:04

+0

这是我的荣幸:) – danyamachine 2014-11-06 17:28:15

相关问题