我使用以下代码将所有 www 请求定向到非 www URL:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)
这在我网站根目录的 .htaccess 文件中非常有效。
例如,
www.example.com -> example.com/www.example.com/
-> example.com/www.example.com/other_page
-> example.com/other_page
但是,如果我将相同的代码移动到我的 VirtualHost 配置中,重写的 URL 将包含一个双斜杠。
www.example.com -> example.com//
www.example.com/ -> example.com//
www.example.com/other_page -> example.com//other_page
我通过从重写规则中删除斜杠来修复它:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^(.*)$ http://example.com$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)
但我无法理解这样做的原因。有谁知道为什么?
是否可以使用URL 重写来提供比它具有的“附加查询字符串”复选框更复杂的查询字符串功能?具体来说,是否可以为某些查询字符串参数指定键并让它只附加那些名称值对。
例如,对于输入:
http://www.example.org/test?alpha=1&beta=2&gamma=3
以及查询字符串参数键列表:beta gamma
它应该输出:http : //www.example.org/redirect?beta=2&gamma=3
(请注意,输入中的查询字符串参数以任意顺序出现。)
我使用nginx作为反向代理,我有 2 条规则,例如:
location ~ ^/indirect {
rewrite ^/indirect(.*) /foobar$1;
}
location ~ ^/foobar {
set $url http://example.com/something/index.php?var1=hello&access=$scheme://$host$uri;
proxy_pass $url;
}
Run Code Online (Sandbox Code Playgroud)
因此,正如您所看到的,我将$uri变量作为参数传递给代理页面(该$uri变量是 nginx 的,请参阅http core module文档)。
问题是,如果我访问http://example.com/foobar/hello%20world,该$uri变量包含 /foobar/hello world(如您所见,%20已被其 url 解码值替换,一个空格)。然后,nginx 在执行 proxy_pass 行(未联系后端)之前返回 http 状态代码 400(错误请求)。
还有可用的变量$request_uri,它保存客户端发出的原始请求 URI,因此在这种情况下,它将保存正确的值和%20序列。但是我不能使用它,因为如果客户端通过/indirect路径,$request_uri将包含/indirect/...而我希望access传递给后端的参数始终为/foobar/...。
有多个indirect类似规则(这是针对 DAV/calDAV/cardDAV 服务器,并且有多个客户端连接到多个路径,所以我需要这些类似indirect规则),所以在proxy_pass那里做是不可行的,并且有直接进入/foobar路径的客户端。
那么有没有什么方法可以 …
我的httpd.conf文件中有这个:
<VirtualHost IP.AD.DR.ESS:80>
ServerName example.com
Redirect Permanent / https://example.net/
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
这成功地将以前的所有内容重定向http://example.com到其新的相应位置https://example.net。但是,我发现一个目录example.com/specialdir/必须保留在旧服务器上,因为它需要访问的数据不在新服务器上。(完成涉及其他几十个站点的迁移需要几个月的时间。)
有没有合理的方法来解决这个问题,httpd.conf或者我将不得不使用一堆.htaccess文件?我怀疑我可以用<Location>容器做一些事情,但我不知道要问正确的问题来查找信息。
我正在将产品从旧类别重定向到新类别。
我已经设法使其符合以下规则:
rewrite ^/old-category/(.*) /new-category/$1;
Run Code Online (Sandbox Code Playgroud)
但是我想知道什么时候应该使用“结束行”符号 $ 以及在我的情况下使用它或不使用它有什么区别。例如:
rewrite ^/old-category/(.*)$ /new-category/$1;
Run Code Online (Sandbox Code Playgroud)
另外,我想重定向用户,如果他们只是写旧的类别名称(没有产品),我应该为类别重定向创建一个新规则还是我可以编辑上面的当前规则以在这两种情况下工作。
提前感谢您的回答。
另一个 nginx 重写规则问题
我怎样才能从http://www.*.domain.com到重写http://*.domain.com?
提前致谢
——黛布
编辑:
很抱歉,我没有看到纺织格式从我的问题中删除了 *。我现在修好了。我需要做的是从 www.joe.domain.com 转到 joe.domain.com,其中 joe 可以是任何单词。
如何使我的规则与 cookie 的确切值匹配?我试过了:
RewriteCond %{HTTP_COOKIE} ^its=me$ [NC]
RewriteCond %{HTTP_COOKIE} its=^me$ [NC]
RewriteCond %{HTTP_COOKIE} its="me" [NC]
RewriteCond %{HTTP_COOKIE} its=me [NC]
Run Code Online (Sandbox Code Playgroud)
最后一个几乎有效,但是当额外的文本位于值的末尾时匹配,例如“me2”。仅当itscookie 的确切值为 时me,条件才应为真,之前或之后没有更多内容。
这些值应不匹配:
我想将站点始终重定向到 www.site.com。但是,我不确定如何让 WWW 始终显示在前面应该说有人在没有 www 的域中键入。
编辑:
server {
listen 80;
server_name site.com;
rewrite ^(.*) https://www.site.com$1 permanent;
}
server {
listen 80;
server_name www.site.com;
#rewrite ^(.*) https://www.site.com$1 permanent;
root /home/site/public_html;
listen 443 ssl;
Run Code Online (Sandbox Code Playgroud)
如果我输入 site.com,它会变成https://www.site.com= SUCCESS
如果我输入 site.com/index.php,它会变成http://www.site.com= NO SSL
想法?
我想尝试mod_alias而不是mod_rewrite几个简单的重定向规则,但是当输入.htaccess. 是否可能mod_alias未在服务器上加载或启用?
我怎么知道?
我正在编辑一个.htaccess文件..
在 RewriteRules 的 RewriteCondition 中,HTTPS_HOST似乎只匹配通过https://协议 (ssl)访问的 url 。我在某处的文档中看到它是一个 T/F 变量,指示是否使用安全协议访问了 url。
然而,我在上文档的麻烦发现是否HTTP_HOST只匹配http://协议,或者如果它有效地匹配//相对的协议,这意味着它符合双方 http:// 和 https://。
有人可以以一种或另一种方式确认,或向我指出此信息的明确来源吗?
此外,如果HTTP_HOST匹配两个协议变体,过滤仅 http://协议匹配的最佳方法是什么?
例子:
<IfModule mod_rewrite.c>
RewriteEngine on
Rewritecond %{HTTP_HOST} ^\/\.(?!some-url).*$
RewriteRule (.*) https://www.example.com/$1 [R=301,L,NC]
</IfModule>
Run Code Online (Sandbox Code Playgroud)
相比之下:
...
Rewritecond %{HTTPS_HOST} ^\/\.(?!some-url).*$
...
Run Code Online (Sandbox Code Playgroud)
编辑:实验表明,HTTP_HOST 这似乎与两种协议都匹配,而HTTPS_HOST仅当协议或 url 以https://.
.
(注重:apache2标签
。TBH,我不能肯定我运行的是什么版本的Apache将尝试找出,这样我就可以装上适当的标签..
我想httpd -v,apache -v, …
rewrite ×10
apache-2.2 ×4
nginx ×4
mod-rewrite ×3
redirect ×3
.htaccess ×1
apache2 ×1
encoding ×1
iis ×1
iis-7 ×1
linux ×1
mod-alias ×1
querystring ×1
rewritecond ×1