我一直在捣乱.htaccess超过一年,但仍然不知道如何自己创建规则,我总是看这里或谷歌,或者在这里问。
所以这次我想要一个“教我如何捕鱼”的要求。我怎样才能真正学会如何编写一个简单的RewriteRule
?
例如,将网址mysite.com/index.php?lang=en
更改为mysite.com/en
我试过阅读the documentation,但坦率地说,它并没有给我任何想法。
您是否知道一个解释此类规则的好网站,尤其是那些将$_GET
变量转换为url文件夹路径的网站?
如果没有,我可以花时间在这里创建一个。
但首先我必须学习:)
谢谢!
答案 0 :(得分:1)
我个人喜欢 the rewrite rule intro ,它制作精良,并且有图像来描述重写时会发生什么,非常方便。
正如hakre在评论中所说,httpd aka apache使用PCRE,这几乎是perl使用的和php preg_*
。
有办法存档你想要的东西。
mysite.com/index.php?lang=en
要
mysite.com/en
第一个是创建内部重定向并更改指向它的链接,这是最简单和常用的方法。
此方法允许您访问mysite.com/en
,同时为您提供mysite.com/index.php?lang=en
内容重定向的内容。
但是,它不会阻止您访问旧网址或重定向该网址。
以下是一个例子:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)/?$ /index.php?lang=$1 [L]
另一种方法是重定向另一个URL并在内部重写它。
所以如果你访问:
mysite.com/index.php?lang=en
它将带您:
mysite.com/en
同时为您提供mysite.com/index.php?lang=en
。
以下是一个例子:
# External redirect
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+index\.php\?lang=([^\s&]+) [NC]
RewriteRule ^ /%1? [R=301,L]
# Internal redirect
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)/?$ /index.php?lang=$1 [L]
要从这些规则中排除现有文件,您可以使用以下条件:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
以上两个条件告诉它只有在文件和文件夹不存在的情况下才会重定向。
答案 1 :(得分:0)
你真的需要开始大量的例子。一旦您认为自己拥有类似的示例,就可以使用此htaccess规则测试人员http://htaccess.madewithlove.be/
来测试您的规则