我在我的专用服务器中使用NGINX.
我有一个问题,返回并重写301.
重写301:
rewrite ^ http://xxx.xxxxx.net/xx-xxx/$request_uri? permanent;
Run Code Online (Sandbox Code Playgroud)
返回301:
location ~ redirect-this/?$ {
return 301 http://xxx.xxxxx.net/xx-xxx/redirect-this$1;
}
Run Code Online (Sandbox Code Playgroud)
所有都正确地重定向到请求的URL.但..
哪个更有效的方法,使301重定向?
我有200多个网址要重定向.那么,你推荐什么?
我需要在我的IIS上使用Url Rewrite模块但它没有安装并说我至少需要IIS7
我有一些静态网站,我只想隐藏.html扩展名:
/foo获取静态文件/foo.html/foo然后客户端可以发送风格的书签mydomain.com/foo而不是mydomain.com/foo.html.
这听起来非常简单,mod_rewrite之前我曾经愉快地使用过(比如使用WordPress或重定向),但事实证明这更难破解.也许我错过了一些非常明显的东西,但我无法在任何地方找到解决方案而且我整天都在这里!
我们运行自己的服务器,所以这可以去哪里是最好的地方.
附录
下面检查的解决方案工作正常.然后在运行该网站一段时间后,我注意到两个问题:
所有页面都开始显得格格不入.我重新加载,清除缓存等,但仍然没有风格.我以前遇到过这个麻烦,找不到来源.
有一个目录和一个名为'gallery'的html文件,因此/ gallery链接显示了一个目录列表而不是html文件.我应该可以排序那个,但欢迎进一步提示:-)
.htaccess我今天更新了 Apache(至 2.4.56-1) ,以前可以正常工作的大量重写现在出现了 AH10411 错误,与查询中的空格有关。我正在努力寻找“适当”的解决方案。
用户单击一个链接,例如<a href='FISH%20J12345.6-78919'>clickme</a>- 您可以看到链接 URL 中的空格已被编码为%20。
.htaccess相关服务器目录中的文件包含并执行以下相关指令:
RewriteRule ^(FISH\s*J[0-9\.]+-?\+?[0-9]+)$ myPage.php?sourceName=$1 [L,QSA]
Run Code Online (Sandbox Code Playgroud)
(在上面我检查的是空格,而不是%20,因为浏览器似乎在符合此规则之前将其转换为空格)。
在我更新 Apache 之前,这一直有效;现在用户收到 403 错误,我的 Apache 错误日志报告:
AH10411:重写的查询字符串包含控制字符或空格
这似乎是一个新错误,因为谷歌搜索什么也没找到!
编辑我的页面(例如)将空格更改为下划线并正确处理它并不是真正的选择,因为该设计旨在支持用户能够直接使用他们关心的对象的名称输入 URL。到目前为止,我发现的唯一解决方法有点难看,即在正则表达式中分别捕获源名称的两个部分,因此:
RewriteRule ^(FISH)\s*(J[0-9\.]+-?\+?[0-9]+)$ myPage.php?sourceName=$1+$2 [L,QSA]
^ ^ ^^^
Run Code Online (Sandbox Code Playgroud)
(我$1%20$2最后尝试了一下,也导致了同样的错误。)
对此有更好的解决方案吗?即,当 URL 位于我想要捕获并作为参数传递给底层页面的字符串中时,我“应该”如何处理 URL 中的空格情况?
我一直在努力解决一些htaccess重定向问题.我只是花了一些时间在堆栈上阅读和搜索,并且无法获得适用于我的场景的anwser.
我正在将旧客户端网站的301重定向转换为新的客户端网站.旧页面有参数查询,我想从网址中删除.
/menu.php?idCategorie=29&idDetail=172
至
/new-website-page/
我有多个查询要做,这里有几个例子:
/menu.php?idCategorie=29&idDetail=172
/menu.php?idCategorie=29&idDetail=182
/menu.php?idCategorie=29&idDetail=184
/menu.php?idCategorie=29&idDetail=256
Run Code Online (Sandbox Code Playgroud)
所有这些都链接到不同的新页面.
这是我试过的:
RewriteCond %{QUERY_STRING} idDetail=172
RewriteRule ^menu.php(.*) /new-page/? [R=301,L]
Run Code Online (Sandbox Code Playgroud)
我被正确重定向,但URL保留查询字符串:
http://website.com/new-page/?idCategorie=29&idDetail=172
Run Code Online (Sandbox Code Playgroud)
我也试过这个:
RewriteRule ^menu.php?idCategorie=29&idDetail=172$ http://website.com/new-page/? [L,R=301]
Run Code Online (Sandbox Code Playgroud)
还有这个:
RewriteCond %{QUERY_STRING} idDetail=172(.*)$
RewriteRule ^menu.php /new-page-name?$1 [L,R=301]
Run Code Online (Sandbox Code Playgroud)
并且它不起作用(最后仍然有查询字符串)
谢谢!
我看到Nginx HttpRewriteModule文档有一个例子,用于将www前缀域重写为非www前缀域:
if ($host ~* www\.(.*)) {
set $host_without_www $1;
rewrite ^(.*)$ http://$host_without_www$1 permanent; # $1 contains '/foo', not 'www.mydomain.com/foo'
}
Run Code Online (Sandbox Code Playgroud)
如何反向 - 将非www前缀域重写为www前缀域?我想也许我可以做类似下面的事情,但Nginx不喜欢嵌套的if语句.
if ($host !~* ^www\.) { # check if host doesn't start with www.
if ($host ~* ([a-z0-9]+\.[a-z0-9]+)) { # check host is of the form xxx.xxx (i.e. no subdomain)
set $host_with_www www.$1;
rewrite ^(.*)$ http://$host_with_www$1 permanent;
}
}
Run Code Online (Sandbox Code Playgroud)
此外,我希望这适用于任何域名,而无需明确告诉Nginx重写domain1.com - > www.domain1.com,domain2.com - > www.domain2.com等,因为我有大量的域要重写.
我需要将非www网址重定向到www网址,用于http和https网址.我尝试在web.config中遵循规则.
<rule name="Redirect to WWW" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTP_HOST}" pattern="^domain.com$" />
</conditions>
<action type="Redirect" url="http://www.domain.com/{R:0}" redirectType="Permanent" />
Run Code Online (Sandbox Code Playgroud)
<rule name="Redirect to WWW https" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTPS}" pattern="^domain.com$" />
</conditions>
<action type="Redirect" url="https://www.domain.com/{R:0}" redirectType="Permanent" />
Run Code Online (Sandbox Code Playgroud)
它适用于非ssl网址,但在ssl的情况下,它从https://domain.com重定向 到http://www.domain.com
请帮我纠正我的规则.
我正在尝试从表单中重写网址:
https://example.com/about
Run Code Online (Sandbox Code Playgroud)
到形式
http://example.com/about
Run Code Online (Sandbox Code Playgroud)
使用IIS7 URL重写:
<!-- http:// to https:// rule -->
<rule name="ForceHttpsBilling" stopProcessing="true">
<match url="(.*)billing/(.*)" ignoreCase="true" />
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="false" />
</conditions>
<action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}{REQUEST_URI}" />
</rule>
<!-- https:// to http:// rule -->
<rule name="ForceNonHttps" stopProcessing="true">
<match url="(.*)billing/(.*)" ignoreCase="true" negate="true" />
<conditions>
<add input="{SERVER_PORT}" pattern="^443$" />
</conditions>
<action type="Redirect" redirectType="Found" url="http://{HTTP_HOST}{REQUEST_URI}" />
</rule>
Run Code Online (Sandbox Code Playgroud)
我不知所措; 我一直在浏览网页上的例子,并尝试我能想到的每一种语法.我简单地指定重写规则似乎没有工作,在所有的任何HTTPS请求,就好像所有的https://请求都平了无形的重写引擎.
规则工作正常; 见下面的答案.
诸如Rails和Django之类的Web框架内置了对"slugs"的支持,后者用于生成可读和SEO友好的URL:
团状串典型地只包含的字符a-z,0-9并-且可因此在不URL转义写入(认为"富%20巴").
我正在寻找一个Java slug函数,给出任何有效的Unicode字符串将返回一个slug表示(a-z,0-9和-).
一个微不足道的slug函数将是这样的:
return input.toLowerCase().replaceAll("[^a-z0-9-]", "");
Run Code Online (Sandbox Code Playgroud)
但是,此实现不会处理国际化和重音(ë> e).解决这个问题的一种方法是列举所有特殊情况,但这不是很优雅.我正在寻找更好的思考和一般的东西.
我的问题:
我通常使用URL重写将内容ID传递给我的网站,所以这一点
Foo.1.aspx
Run Code Online (Sandbox Code Playgroud)
重写为
Foo.aspx?id=1
Run Code Online (Sandbox Code Playgroud)
对于特定的应用程序,我需要将多个ID传递给单个页面,所以我重写了要接受的东西:
Foo.1,2,3,4,5.aspx
Run Code Online (Sandbox Code Playgroud)
这在Cassini(Visual Studio的内置临时Web服务器)中运行良好,但是当我在运行IIS的实时服务器上尝试时,它给了我"Internet Explorer无法显示网页".这是IIS限制吗?我应该使用短划线或下划线而不是逗号吗?