我试图重写一些网址,但我的新闻正在阻碍。
输入地址栏的网址
example.com/prefix-suffix.html
example.com/prefix-suffix.html?v=huzzah
所需的输出(希望它们显示为)
example.com/prefix/suffix/
example.com/prefix/suffix/huzzah
我已经查看了其他几个例子like this one,但我只是不明白他们究竟在做什么,或者多么明确,这使得修改很有挑战性。
如果你有时间解释每一行的作用,我会非常欣赏它。
感谢。
答案 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
以进行内部重定向。