我个人喜欢重写规则介绍,它制作精良,并且有图像来描述重写发生的情况,非常方便。
正如 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
提供内部重定向的内容。
但是,它不会阻止您访问旧 URL 或重定向它。
这是一个例子:
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
上述 2 个条件告诉它仅在文件和文件夹不存在时才重定向。