1

好的,我对 mod_rewrite 并不感到惊讶。我正在努力变得更好-但有时阅读起来有点困难。

无论如何,我正在尝试为客户设置一个测试站点,并移动他们当前的实时站点。我一直在阅读 mod_rewrite,但很难为我找到一个易于理解的来源。

他们有一个相当广泛的 .htaccess 文件。

例如:

RewriteCond %{HTTP_HOST} ^clientdomain\.com
RewriteCond %{HTTPS} =on
RewriteRule .* https://www.%{SERVER_NAME}%{REQUEST_URI} [R,L]

我读这个的方式是——

如果域以 clientdomain.com 开头,则重定向到启用了 HTTPS 的服务器 - 我读对了吗?

接下来是这样的:

RewriteCond %{HTTP_HOST} ^(.*)clientdomain2.COM [NC]
RewriteRule ^(.*)$ clientdomain/template.php?pid=49 [R,L]

据我所知,这表示如果域是 clientdomain2.com,则指向 clientdomain 并使用 pid=49 的 GET 参数转到 template.php 页面 - 对吗?

最后,我完全不知道这意味着什么:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/index.php
RewriteCond %{REQUEST_URI} (/|\.php|\.html|\.htm|/[^.]*)$  [NC]
RewriteRule ^(.*)(/|\.php|\.html|\.htm)*$ index.php?phpinc=$1 [QSA]
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

看起来第一部分正在剥离所有 .php、.htm 和 .html - 对吗?

对此的任何建议,或易于理解的 mod_rewrite 处理的来源将非常受欢迎

4

1 回答 1

1

如果域以 clientdomain.com 开头,则重定向到启用了 HTTPS 的服务器 - 我读对了吗?

几乎,它应该被阅读:

“如果域以clientdomain.com AND请求是 HTTPS 请求开头,则 302 重定向到ServerName指令定义的服务器(可能在 vhost 配置中),但www.前面有一个相同的请求并使用 HTTPS。”

据我所知,这表示如果域是 clientdomain2.com,则指向 clientdomain 并使用 pid=49 的 GET 参数转到 template.php 页面 - 对吗?

不,这会检查其中的任何内容clientdomain2.COM,不区分大小写(NC标志),并且 302 会将其重定向到相同的主机和协议以及 URI /clientdomain/template.php?pid=49。因为它不包含协议和主机名(例如http://clientdomain2.com/),所以它将重定向到与发出请求的主机和协议相同的主机和协议,只有 URI 发生变化。示例:请求是 forhttp://www.clientdomain2.com/something/foo并且重定向到http://www.clientdomain2.com/clientdomain/template.php?pid=49.

看起来第一部分正在剥离所有 .php、.htm 和 .html - 对吗?

这是一种“路由”类型的规则。这些规则通常重定向规则之后,因为它是一个包罗万象的东西。它在说:

  1. 该请求不适用于现有文件
  2. 该请求不适用于现有目录
  3. 请求的 URI 不以/index.php
  4. 请求的 URI 以下列扩展名之一结束(不区分大小写,NC标志):php, html, htm,或者请求的 URI 只是/,或者请求的 URI 根本没有扩展名(/[^.]*表达式)。看起来这个条件是为了防止将规则应用于脚本、图像、css 样式等。
  5. 如果满足条件 1-4,则在内部将请求重写为使用请求 URI 的值/index.php命名的查询字符串参数(如果存在则不带任何扩展名)(无扩展名)。phpinc任何现有的查询字符串参数都附加到末尾(QSA标志)。

最后一条规则是将环境变量设置为标头HTTP_AUTHORIZATION中的任何内容Authorization$_SERVER这通过php 脚本中的变量获取。

于 2012-12-26T20:56:53.413 回答