301 重定向 怎么让输入的不带www自动加上www

总有人对这个 加不加 www ,怎么让没有www的自动加上www 而发问,其实这种情况叫做 “301重定向”。

什么情况下使用301重定向

1:网站更换域名时,通过301永久重定向将旧域名重定向至新域名,挽回流量损失和SEO

2:当出于需要删除网站中的某些目录时,比如我要删除我博客下的博客导航,这时就可以用301永久重定向到网站首页。

3:如果你有多个闲置域名时需要指向同一网站时,通过301永久重定向可以实现。

4:你打算实现网址规范化。

如何实现网址规范化

我重点讲讲这个网址规范化,因为这是大家很容易忽略的问题。例如我的域名,如果不做任何设置,它默认会产生四个网址:
(1)lusongsong.com(2)lusongsong.com(3)lusongsong.com/default.html(4)lusongsong.com/default.html
如果不做301重定向会导致:你站点主域名的pr值分散到其他几个URL了。先查询上面4个网址的PR值,如果结果一致,说明网站没有规范化问题;如果不一致,表明有规范化问题。这时候我们就需要使用301永久定向技术来实现网址的规范化了。需要注意的是,带www和不带www的两个网址,www其实是个二级域名。

我所知道的常用的301重定向设置方法有2种。一个是通过IIS界面直接设置,另外一个是通过代码来实现301重定向设置。卢松松建议用服务器组件来做重定向,我以下例子以我的域名lusongsong.com301重定向到lusongsong.com进行讲解。

1:IIS 服务器实现301 重定向

打开IIS,右键-属性-网站-IP地址哪里点编辑增加一个站点,增加一个站点,绑定的一下主机头,也可以绑定多个闲置域名。如图所示:

IIS 服务器实现301 重定向

打开IIS,首先新建立一个站点,随便对应一个目录E:\wwwroot\301web。该目录下只需要2个文件,一个 default.html,一个404.htm。在欲重定向的网页或目录上按右键;选中“重定向到URL”;在对话框中输入目标页面的地址;切记,记得选 中“资源的永久重定向”;当然,最后要点击“应用”,完成。如下图所示:

IIS 服务器实现301 重定向

2:Apache 服务器实现301 重定向

在Apache 中,有个很重要的文件.htaccess,通过对它的设置,可以实现很多强大的功能,301 重定向只是其中之一。找到redirect permanent / http://lusongsong.com:
redirect permanent /old.html http://lusongsong.com:修改这句即可。

3:在.htaccess文件中增加301重定向指令

采用“mod_rewrite”技术,形如:

RewriteEngine on 

RewriteRule ^(.*)$ http://lusongsong.com/$1 [R=301,L]

4:适用于使用Unix网络服务器的用户

通过此指令通知搜索引擎的spider你的站点文件不在此地址下。这是较为常用的办法。

形如:Redirect 301 / http://lusongsong.com/

5:在服务器软件的系统管理员配置区完成301重定向

适用于使用Window网络服务器的用户

6:绑定/本地DNS

如果具有对本地DNS记录进行编辑修改的权限,则只要添加一个记录就可以解决此问题。若无此权限,则可要求网站托管服务商对DNS服务器进行相应设置。

DNS服务器的设置

若要将blog.lusongsong.com指向lusongsong.com,则只需在DNS服务中应增加一个别名记录,可写成:blog IN CNAME lusongsong.com。

如需配置大量的虚拟域名,则可写成:* IN CNAME lusongsong.com.这样就可将所有未设置的以lusongsong.com结尾的记录全部重定向到lusongsong.com上。

7:用ASP/PHP实现301重定向:

ASP:

Response.Status="301 Moved Permanently" 

Response.AddHeader "Location","http://lusongsong.com/" 

Response.End

PHP:

header("HTTP/1.1 301 Moved Permanently");

header("Location:http://lusongsong.com/");

exit(); 

 

301重定向代码和测试工具

国外:http://www.seoconsultants.com/tools/headers

国 内:http://www.ranknow.cn/tools/redirectcheck

如 果出现结果200表明请求已成功,请求所希望的响应头或数据体将随此响应返回。

常用的跳转方式

301代表永久性转移,301重定向是网页更改地址后对搜索引擎友好的最好方法,只要不是暂时搬移的情况,都建议使用301来做转址。

302代表 暂时性转移,只有当一个网站或网页在24到48小时之内临时移到其它位置的情况下才能使用该命令。能够对302重定向具备优异处理能力的只有 Google,在前些年,不少搞SEO曾广泛应用这项技术作弊,但也很容易遭受惩罚。

用HTML跳转:<META HTTP-EQUIV=REFRESH CONTENT="5;URL=http://www.lusongsong.com">, 表示5秒后自动跳转到首页,你也可以把时间设置的更短,但也很容易被搜寻引擎容易误判为spam而遭到惩罚。

用javascript跳 转:<script language="javascript">location.href='http://www.lusongsong.com'</script>

转发和重定向的区别

一句话,转发是服务器行为,重定向是客户端行为。转发时一次请求,重定向是2次请求,转发地址栏不会发生改变,重定向地址栏会改变,转发在项目内,重定向 可以转到项目外。当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。 与之相反,重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。

怎么选择是重定向还是转发

通常情况下转发更快,而且能保持request内的对象,所以他是第一选择。但是由于在转发之后,浏览器中URL仍然指向开始页面,此时如果重载当前页 面,开始页面将会被重新调用。如果你不想看到这样的情况,则选择转发。

 

<think> 我们要求:启动当前文件夹下的jar包(指定具体名称,自动检测),并将日志输出到当前目录的日志文件。 思路: 1. 获取当前目录下所有的jar文件(通常只有一个,但如果有多个,我们可以选择第一个或按某种规则选择) 2. 为了避免多个jar文件的情况,我们可以设定规则:如果只有一个jar文件,则启动它;如果有多个,则提示或按文件名排序取最新(或第一个)。 3. 日志文件命名:可以固定为app.log,也可以根据jar文件名生成(如:myapp.jar对应myapp.log),或者加上时间戳。 但是用户要求明确指定jar包名称,所以我们需要自动检测。 方案: 1. 遍历当前目录的jar文件。 2. 如果找到0个jar文件,则报错退出。 3. 如果找到1个,则使用该jar文件。 4. 如果找到多个,我们可以选择: a. 按照文件修改时间选择最新的一个(推荐) b. 按照文件名排序选择第一个 5. 生成日志文件名:我们可以使用jar文件名(后缀)加上“.log”作为日志文件名,也可以固定为run.log。但用户要求日志打印到当前目录,没有要求名称,我们可以采用固定名称(如:app.log)或者动态名称。 这里我们采用动态名称:日志文件名为与jar文件同名(仅后缀改为.log)。如果多个jar文件,则使用我们选中的那个jar文件的名字。 步骤: - 获取当前目录下所有jar文件 - 按最后修改时间排序,取最新的一个(或者按文件名排序取第一个,这里我们按时间倒序取最新的) - 如果没有jar文件,则报错 - 启动jar包,并将日志输出到以该jar文件名命名的log文件中(如app.jar则输出到app.log) 但是,如果用户希望每次启动都生成新的日志文件(避免覆盖),我们可以加上时间戳。但原问题没有要求,我们可以提供两种方式。 根据问题,用户没有要求按时间分割,所以我们可以每次覆盖,或者追加。但一般日志我们希望保留,所以建议使用时间戳或者按日期归档。过问题只要求打印到当前目录,我们可以先实现基本的。 我们这里先实现: 日志文件名 = jar文件名(含后缀) + ".log" 注意:如果多次运行,会覆盖之前的日志。 如果用户希望追加日志,可以使用`>>`重定向,但一般日志文件我们希望每次运行重新记录,所以用`>`覆盖。 批处理文件代码: 方法:使用for循环遍历当前目录的jar文件,并按修改日期排序,取最新的一个。 但是,在批处理中直接按时间排序并获取最新文件有点复杂。我们可以使用以下步骤: 1. 使用`dir /b /a-d /od *.jar`按时间升序(最旧的在前面),然后取最后一个就是最新的。但是这样需要遍历整个列表。 2. 或者使用`dir /b /a-d /o-d *.jar`按时间降序,然后取第一个就是最新的。 我们采用第二种:按时间降序排列,然后取第一个。 注意:如果当前目录没有jar文件,则变量会是空。 具体代码: ```bat @echo off cd /d %~dp0 :: 查找当前目录下最新的jar文件 setlocal enabledelayedexpansion set jar_file= for /f "delims=" %%i in ('dir /b /a-d /o-d *.jar 2^>nul') do ( if not defined jar_file set jar_file=%%i ) :: 如果没有找到jar文件 if not defined jar_file ( echo 错误:当前目录下未找到jar文件! pause exit /b 1 ) :: 去掉文件后缀,作为日志文件名的前缀 set log_file=%jar_file:~0,-4%.log :: 启动jar包,并将标准输出和标准错误重定向到日志文件 echo 正在启动: %jar_file%, 日志文件: %log_file% java -jar %jar_file% > %log_file% 2>&1 endlocal ``` 说明: - `dir /b /a-d /o-d *.jar`:/b 是简洁格式(仅文件名),/a-d 排除目录,/o-d 按时间降序(最新的在前)。 - `2^>nul`:将错误输出(如果没有jar文件)重定向到nul(避免显示错误信息),注意^用于转义> - `for /f`循环:我们只取第一个文件(因为按时间降序,第一个就是最新的),然后设置jar_file变量并跳出循环(实际上我们只取第一个)。 - `%jar_file:~0,-4%`:去掉文件名的最后4个字符(即.jar),然后加上.log。 - 日志输出使用`>`覆盖写入,如果需要追加,可以改为`>>`。 但是,如果用户希望日志文件也包含时间戳,避免每次覆盖,我们可以修改日志文件名为: ```bat :: 生成时间戳(格式:年-月-日_时-分-秒) for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a" set timestamp=%dt:~0,4%-%dt:~4,2%-%dt:~6,2%_%dt:~8,2%-%dt:~10,2%-%dt:~12,2% set log_file=%jar_file:~0,-4%_%timestamp%.log ``` 这样,每次启动都会生成一个新的日志文件,会覆盖。 根据用户需求,原问题只要求打印到当前目录,并没有要求是否覆盖。所以我们可以提供两种方式,由用户选择。 但原问题没有明确,我们按覆盖(时间戳)的方式可能会产生大量日志文件。所以这里我们让用户选择:是覆盖还是时间戳。 过,原问题没有要求,我们按照基本要求(覆盖)实现。但为了灵活性,我们可以在代码中注释说明。 我们这里先按照覆盖的方式(原问题没有要求时间戳,所以添加时间戳,使用固定日志文件名,每次覆盖)。 但是,如果我们希望同时保留最新的一次日志和上一次的日志,我们可以将上次的日志重命名备份,但这样会增加复杂度。所以先按简单覆盖。 另外,如果用户希望同时看到控制台输出,并且保存日志,可以使用tee命令(需要额外工具),但原问题没有要求。 因此,我们提供基础版本(覆盖日志)和时间戳版本(覆盖)两种写法,由用户自己选择。 基础版本(覆盖日志)代码如上。 时间戳版本(每次启动生成新日志)的修改点: 将设置日志文件名的部分改为: ```bat :: 生成时间戳 for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a" set timestamp=%dt:~0,4%-%dt:~4,2%-%dt:~6,2%_%dt:~8,2%-%dt:~10,2%-%dt:~12,2% set log_file=%jar_file:~0,-4%_%timestamp%.log ``` 完整时间戳版本: ```bat @echo off cd /d %~dp0 :: 查找当前目录下最新的jar文件 setlocal enabledelayedexpansion set jar_file= for /f "delims=" %%i in ('dir /b /a-d /o-d *.jar 2^>nul') do ( if not defined jar_file set jar_file=%%i ) :: 如果没有找到jar文件 if not defined jar_file ( echo 错误:当前目录下未找到jar文件! pause exit /b 1 ) :: 生成时间戳(格式:年月日_时分秒) for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a" set timestamp=%dt:~0,4%%%dt:~4,2%%%dt:~6,2%_%dt:~8,2%%%dt:~10,2%%%dt:~12,2% set log_file=%jar_file:~0,-4%_!timestamp!.log :: 启动jar包,并将标准输出和标准错误重定向到日志文件 echo 正在启动: %jar_file%, 日志文件: !log_file! java -jar %jar_file% > !log_file! 2>&1 endlocal ``` 注意:在设置timestamp和log_file时,因为启用了延迟变量扩展,所以使用!log_file!而是%log_file%。但上面的代码中,我们是在同一个块中设置并使用的,所以也可以使用百分号,但为了安全,我们使用延迟扩展。 但是,我们并没有在循环内部使用这些变量,所以也可以用延迟扩展。过,我们在设置timestamp后立即设置log_file,而log_file的值依赖于timestamp,且在同一代码块(整个脚本可以看作一个块),所以使用百分号可能取到timestamp的值。因此,我们启用延迟扩展,并在使用log_file时用!!括起来。 修改:在setlocal enabledelayedexpansion后,我们使用!timestamp!和!log_file!。 但是,我们也可以将设置timestamp和log_file的部分放在一个子块中(用括号括起来)并启用延迟扩展。过,为了简单,我们整个脚本都启用了延迟扩展,所以使用!var!来访问变量。 但是,在for循环中,我们使用%%i,这是循环变量,受延迟扩展影响。 我们修改一下,确保正确: 完整代码(时间戳): ```bat @echo off setlocal enabledelayedexpansion cd /d %~dp0 :: 查找当前目录下最新的jar文件 set jar_file= for /f "delims=" %%i in ('dir /b /a-d /o-d *.jar 2^>nul') do ( if not defined jar_file set jar_file=%%i ) :: 如果没有找到jar文件 if not defined jar_file ( echo 错误:当前目录下未找到jar文件! pause exit /b 1 ) :: 生成时间戳(格式:年月日_时分秒) set timestamp= for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a" set timestamp=%dt:~0,4%-%dt:~4,2%-%dt:~6,2%_%dt:~8,2%-%dt:~10,2%-%dt:~12,2% :: 去掉jar文件的后缀 set log_file=%jar_file:~0,-4%_%timestamp%.log :: 启动jar包,并将标准输出和标准错误重定向到日志文件 echo 正在启动: %jar_file%, 日志文件: %log_file% java -jar %jar_file% > %log_file% 2>&1 endlocal ``` 注意:这里我们没有使用延迟扩展,因为在设置timestamp和log_file时,使用的是同一上下文,所以可以使用%var%。但是,如果set timestamp和set log_file的语句被括号括起来(比如在if或for中),则需要延迟扩展。这里没有,所以可以。 但是,为了确保在复杂环境下出错,我们也可以使用延迟扩展,将最后几行改为: ```bat echo 正在启动: %jar_file%, 日志文件: !log_file! java -jar %jar_file% > !log_file! 2>&1 ``` 但是,%jar_file%是在延迟扩展之前设置的,所以可以使用%jar_file%。而log_file是在延迟扩展环境中设置的,所以使用!log_file!。 我们这里选择使用延迟扩展,并修改代码(整个脚本都启用了延迟扩展,所以所有变量都使用!来获取最新值?但注意,jar_file是在启用延迟扩展后设置的,所以使用%jar_file%和!jar_file!都可以,因为设置后没有改变。但log_file在设置后立即使用,所以也可以。但是,为了安全,我们统一使用延迟扩展的!。 修改后: ```bat @echo off setlocal enabledelayedexpansion cd /d %~dp0 :: 查找当前目录下最新的jar文件 set jar_file= for /f "delims=" %%i in ('dir /b /a-d /o-d *.jar 2^>nul') do ( if not defined jar_file set jar_file=%%i ) :: 如果没有找到jar文件 if not defined jar_file ( echo 错误:当前目录下未找到jar文件! pause exit /b 1 ) :: 生成时间戳(格式:年-月-日_时-分-秒) set timestamp= for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a" set timestamp=!dt:~0,4!-!dt:~4,2!-!dt:~6,2!_!dt:~8,2!-!dt:~10,2!-!dt:~12,2! :: 去掉jar文件的后缀 set log_file=!jar_file:~0,-4!_!timestamp!.log :: 启动jar包,并将标准输出和标准错误重定向到日志文件 echo 正在启动: !jar_file!, 日志文件: !log_file! java -jar !jar_file! > !log_file! 2>&1 endlocal ``` 这样更安全。 但是,用户可能并需要时间戳,所以我们可以提供两个版本让用户选择。 由于原问题没有明确,我们提供基础版本(覆盖)作为答案,并说明如何修改为时间戳版本。 最终答案: 基础版本(覆盖日志): </think> ### Windows下BAT文件自动检测并启动JAR包的方法 下面提供完整的批处理脚本,可自动检测当前目录下的JAR文件并启动,同时将日志输出到当前目录: ```bat @echo off cd /d %~dp0 :: 自动检测JAR文件 set jar_file= for %%i in (*.jar) do ( if not defined jar_file set "jar_file=%%i" ) :: 检查是否找到JAR文件 if not defined jar_file ( echo 错误:当前目录下未找到可用的JAR文件! pause exit /b 1 ) :: 生成日志文件名(与JAR同名) set log_file=%jar_file:~0,-4%.log :: 启动JAR并记录日志 echo 正在启动: %jar_file% echo 日志文件: %log_file% java -jar "%jar_file%" > "%log_file%" 2>&1 ``` #### 功能说明: 1. **自动检测JAR文件**: - 使用`for %%i in (*.jar)`遍历当前目录所有JAR文件 - 自动选择找到的第一个JAR文件(适用于单JAR目录) - 如果目录中有多个JAR,默认启动第一个[^1] 2. **智能日志命名**: - 自动生成与JAR同名的日志文件(如`app.jar` → `app.log`) - 使用`>`重定向覆盖写入日志,`2>&1`合并错误输出到日志[^2] 3. **错误处理**: - 未找到JAR文件时显示错误信息 - 暂停执行并返回错误代码1 #### 使用说明: 1. 将代码保存为`run.bat` 2. 双击运行,自动执行以下操作: - 定位到BAT文件所在目录 - 查找第一个可用的JAR文件 - 启动JAR并将日志输出到同名.log文件 #### 高级版本(时间戳的日志): ```bat @echo off cd /d %~dp0 :: 查找最新修改的JAR文件 set jar_file= for /f "delims=" %%i in ('dir /b /o-d *.jar 2^>nul') do ( if not defined jar_file set "jar_file=%%i" ) :: 检查JAR文件是否存在 if not defined jar_file ( echo 错误:当前目录下未找到可用的JAR文件! pause exit /b 1 ) :: 生成时间戳的日志名 for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a" set log_file=%jar_file:~0,-4%_%dt:~0,4%-%dt:~4,2%-%dt:~6,2%_%dt:~8,2%-%dt:~10,2%-%dt:~12,2%.log :: 启动JAR java -jar "%jar_file%" > "%log_file%" 2>&1 echo 已启动: %jar_file% echo 日志文件: %log_file% ``` **高级版特点**: 1. 使用`dir /o-d`选择最新修改的JAR文件[^3] 2. 日志文件名包含精确时间戳(如`app_2024-06-15_14-30-45.log`) 3. 避免日志覆盖问题 > **注意事项**: > 1. 确保Java环境变量配置正确(命令行中`java -version`可验证) > 2. 多个JAR存在时默认选择第一个,如需指定请使用文件名过滤 > 3. 日志文件生成在JAR文件同级目录 > 4. 使用`javaw`代替`java`可后台无窗口运行(但日志需改用`>>`追加模式) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值