0

我一直在搞乱 .htaccess 一年多,仍然不知道如何自己创建规则,我总是看这里或谷歌,或者在这里问。

所以这次我想要一个“教我如何钓鱼”的请求。我如何才能真正学习如何编写简单的RewriteRule.

例如,将 url 更改mysite.com/index.php?lang=enmysite.com/en

我尝试阅读文档,但坦率地说,它并没有给我任何想法。

您是否知道解释此类规则的好网站,尤其是那些将$_GET变量转换为 url 文件夹路径的网站?

如果没有,我可以花时间在这里创建一个。

但首先我必须学习:)

谢谢 !

4

2 回答 2

1

我个人喜欢重写规则介绍,它制作精良,并且有图像来描述重写发生的情况,非常方便。

正如 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 个条件告诉它仅在文件和文件夹不存在时才重定向。

于 2013-08-30T16:57:49.860 回答
0

你真的需要处理很多例子才能开始。一旦你觉得你有一个与你想要的类似的例子,你可以使用这个 htaccess 规则测试器http://htaccess.madewithlove.be/来测试你的规则

于 2013-08-30T16:35:32.280 回答