对于想了解你会使用Laravel视图view()与重定向redirect()吗?的读者,本文将是一篇不可错过的文章,我们将详细介绍laravelview,并且为您提供关于.htaccess技巧:URL
对于想了解你会使用Laravel视图view()与重定向redirect()吗?的读者,本文将是一篇不可错过的文章,我们将详细介绍laravel view,并且为您提供关于.htaccess技巧: URL重写(Rewrite)与重定向(Redirect)、2. Laravel视图View和路由Route初探 - Laravel从零开始教程、2.反转函数url_for与重定向redirect、302临时重定向(temporaryredirect)的有价值信息。
本文目录一览:- 你会使用Laravel视图view()与重定向redirect()吗?(laravel view)
- .htaccess技巧: URL重写(Rewrite)与重定向(Redirect)
- 2. Laravel视图View和路由Route初探 - Laravel从零开始教程
- 2.反转函数url_for与重定向redirect
- 302临时重定向(temporaryredirect)
你会使用Laravel视图view()与重定向redirect()吗?(laravel view)
下面由Laravel教程栏目给大家介绍Laravel视图view()与重定向redirect(),希望对需要的朋友有所帮助!一、 view() 的使用
简单的返回视图
// 所传的参数是blade模板的路径 // 如果目录是 resources/views/static_pages/home.blade.PHP 则可以使用 return view('static_pages/home'); 或 return view('static_pages.home');
向视图传递数据
$title = 'Hello Laravel'; $user = User::find(1); // view() 的第二个参数接受一个数组 return view('static_pages/home', compact('user')); return view('articles.lists')->with('title',$title); // 所传递的变量在blade模板中用 {{ $title }} 或 {!! $title !!} 输出 // 前者作为文本输出,后者作为页面元素渲染
二、redirect() 的使用
基于 Url 的重定向
// 假设我们当前的域名为:http://localhost 则重定向到 http://localhost/home return redirect('home');
基于路由的重定向
return redirect()->route('home');
基于控制器的重定向
return redirect()->action('UserController@index')
传递数据
return redirect('home')->with('title', 'Hello Laravel'); // 将表单值保存到 Session 中,可以用 {{ old('param') }} 来获取 return redirect('home')->withinput(); // 接收一个字符串或数组,传递的变量名为 $errors return redirect('home')->withErrors('Error');
其他用法
// 返回登录前的页面,参数为默认跳转的页面 redirect()->intended(route('home')); // 返回上一个页面,注意避免死循环 redirect()->back();
三、使用 view() 或 redirect() 的选择
view() 和 redirect() 的异同
使用 return view() 不会改变当前访问的 url , return redirect() 会改变改变当前访问的 url
使用 return view() 不会使当前 Session 的 Flash 失效 ,但是 return redirect() 会使 Flash 失效
在 RESTful 架构中,访问 Get 方法时推荐使用 return view() ,访问其他方法推荐使用 return redirect()
.htaccess技巧: URL重写(Rewrite)与重定向(Redirect)
目录 Table of Contents
一、准备开始:mod_rewrite
二、利用.htaccess实现URL重写(rewrite)与URL重定向(redirect)
将.htm页面映射到.php
临时重定向(R=302)与永久重定向(R=301)
为什么要用重定向?——重定向和URL重写的区别
长短地址转换
去掉www
加上www
支持多域名访问
三、改写查询字符串QUERY_STRING
利用QSA转换查询字符串QUERY_STRING
利用RewriteCond改写查询字符串QUERY_STRING
QSA与RewriteCond双剑齐发
剥离查询字符串
四、利用RewriteCond和RewriteRule进行访问控制
文件访问控制
用.htaccess阻止User-agent
用.htaccess阻止盗链(hot-linking)
References
URL重定向是.htaccess的重头戏,它可以将长地址转为短地址、将动态地址转为静态地址、重定向丢失的页面、防止盗链、实现自动语言转换等。笔者觉得难点是在正则表达式的运用和理解上。有关htaccess的正则表达式用法,请查阅本站《.htaccess正则表达式》一文。
一、准备开始:mod_rewrite
实现所有这些神奇功能的模块叫做mod_rewrite,请确保你的服务器安装并启用了该模块:
sudo a2enmod rewrite
我们一般会把所有涉及URL重写或者重定向的代码这样放置:
<IfModule mod_rewrite.c>
# Turn on rewrite engine
Options +FollowSymlinks
RewriteEngine on
# More rules below
...
</IfModule>
一些我们需要注意的地方:
FollowSymlinks必须启用,这是rewrite引擎的安全需求。
通常FollowSymlinks在Apache的主配置文件中就已经启用了,所以通常可以省略。
RewriteEngine命令用于启用rewrite引擎
IfModule命令用于判断Apache是否安装了mod_rewrite模块,之后笔者会省略该命令,但不代表这是个好习惯。
mod_rewrite会处理所有提交给Apache的URL请求,并与之后的规则进行匹配
下面我们开始讲解一些例子。
二、利用.htaccess实现URL重写(rewrite)与URL重定向(redirect)
1.将.htm页面映射到.php
Options +FollowSymlinks
RewriteEngine on
RewriteRule ^(.*)\.htm$ $1.php [NC]
注意事项:
该RewriteRule能够将.htm静态页面映射到.php动态页面
如果通过.htm进入,浏览器地址栏显示的是.htm扩展名,但服务器上实际执行的是.php
必须保证服务器上有对应的.php,否则会404
浏览器和搜索引擎可以同时通过.htm和.php访问网页
如果该目录上存在.htm,将被忽略
[NC]表示“不区分大小写”,更多类似定义请参考本站《.htaccess正则表达式》一文
2.临时重定向(R=302)与永久重定向(R=301)
RewriteEngine on
RewriteBase /
RewriteRule ^(.*)\.htm$ $1.php [R,NC,L]
注意事项:
该RewriteRule能够将.htm静态页面重定向到.php动态页面
如果通过.htm进入,浏览器地址栏会自动转为.php,这也是重定向的本质
必须保证服务器上有对应的.php,否则会404
浏览器和搜索引擎可以同时通过.htm和.php访问网页
如果该目录上存在.htm,将被忽略
RewriteBase定义了重写基准目录。
例如,如果你将虚拟站点设置在/var/www目录下,删除这行将会导致重定向到http://yourdomain.com/var/www/1.php。显然这是找不到的,而且你也不会希望用户看见你的服务器的目录结构。
再举个例子,如果RewriteBase /base/,那么将会重定向到http://yourdomain.com/base/1.php。
对于重写基准目录,我们还可以通过将$1.php变成/$1.php实现直接变换,这时就可以将RewriteBase省略。
字母R表示临时重定向,相当于[R=302,NC]。关于重定向代码,请参考本站《HTTP协议重定向编码》
字母L表示如果能匹配本条规则,那么本条规则是最后一条(Last),忽略之后的规则。
在讨论R=302临时重定向后,理解R=301永久重定向也就容易多了:
RewriteEngine on
RewriteRule ^(.*)$ http://newdomain.com/$1 [R=301,NC,L]
这个规则告诉浏览器和搜索引擎,网站地址发生了永久性变更,用户的URL请求将会被发送给新的域名(主机)处理。
由于是重定向到新的主机地址,RewriteBase也就没有出现的必要了。
3.为什么要用重定向?——重定向和URL重写的区别
通过重定向,浏览器知道页面位置发生变化,从而改变地址栏显示的地址
通过重定向,搜索引擎意识到页面被移动了,从而更新搜索引擎索引,将原来失效的链接从搜索结果中移除
临时重定向(R=302)和永久重定向(R=301)都是亲搜索引擎的,是SEO的重要技术
URL重写用于将页面映射到本站另一页面,若重写到另一网络主机(域名),则按重定向处理
4.长短地址转换
利用URL重写,我们可以很方便地实现长短地址的转换,但是用重定向就不合适了。
RewriteEngine On
RewriteRule ^grab /public/files/download/download.php
若访问
http://mysite/grab?file=my.zip
则会执行该页面:
http://mysite/public/files/download/download.php?file=my.zip
5.去掉www
Options +FollowSymlinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,NC,L]
6.加上www
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(.*)$
RewriteRule (.*) http://www\.%1/$1 [R=301,L]
7.支持多域名访问
如果你不凑巧买到了不支持多域名的主机,那么.htaccess或许可以帮助你。现在假设你有域名domain-one.com和domain- two.com,并且在服务器根目录有对应文件夹one和two,那么通过下面的改写就能让Apache同时接受者两个域名的请求:
#two domains served from one root..
RewriteCond %{HTTP_HOST} domain-one.com
RewriteCond %{REQUEST_URI} !^/one
RewriteRule ^(.*)$ /one/$1 [L]
RewriteCond %{HTTP_HOST} domain-two.com
RewriteCond %{REQUEST_URI} !^/two
RewriteRule ^(.*)$ /two/$1 [L]
三、改写查询字符串QUERY_STRING
查询字符串是指URL请求中“问号”后面的部分。比如,http://mysite/grab?foo=bar中粗体部分就是查询字符串,其中变量名是foo,值是bar。
1.利用QSA转换查询字符串QUERY_STRING
QSA标志( Query String Appending)用于在URI中截取查询字符串,这个截取操作是通过小括号正则表达式实现的:
RewriteEngine On
RewriteRule /pages/(.+) /page.php?page=$1 [QSA]
将会把请求/pages/123?one=two 映射到 /page.php?page=123&one=two
注意粗体部分几乎是相同的,除了“问号”变成了“与”符号
如果没有QSA标志,那么会映射到/page.php?page=123。
如果没有用到小括号正则表达式,就不需要QSA,这在上节“长短地址转换”中已经例证过了。
小括号正则表达式可以截取查询字符串中的内容,但是如果没有开启QSA标志,那么在/page.php?page=$1中“问号”之后将会被剥离丢弃。这种特性可以用于实现“剥离查询字符串”
通过QSA,我们可以将简单链接/simple/flat/link/ 映射成 server-side.php?first-var=flat&second-var=link
RewriteEngine On
RewriteRule ^/([^/]+)/([^/]+)/? /index.php?first-var=$1&second-var=$2 [QSA]
2.利用RewriteCond改写查询字符串QUERY_STRING
RewriteEngine On
RewriteCond %{QUERY_STRING} foo=(.*)
RewriteRule ^grab(.*) /page.php?bar=%1
该规则将访问请求http://mysite/grab?foo=bar转换为http://mysite/page.php?bar=bar
RewriteCond用于捕获查询字符串(QUERY_STRING)中变量foo的值,并存储在%1中
QUERY_STRING是Apache定义的“变量=值”向量(数组)
3.QSA与RewriteCond双剑齐发
RewriteEngine On
RewriteCond %{QUERY_STRING} foo=(.+)
RewriteRule ^grab/(.*) /%1/index.php?file=$1 [QSA]
会把/grab/foobar.zip?level=5&foo=bar 映射到 /bar/index.php?file=foobar.zip&level=5&foo=bar
转换后根目录是bar目录
foobar.zip?level=5中的“问号”变成了foobar.zip&level=5中的“与”符号
4.剥离查询字符串
只需在要开始剥离的链接后面加个“问号”,并且不要启用QSA标志,就可剥离查询字符串
RewriteEngine On
# Whatever QS is
RewriteCond %{QUERY_STRING} .
# I don''t want it with Question mark
RewriteRule foo.php(.*) /foo.php? [L]
四、利用RewriteCond和RewriteRule进行访问控制
我们在第一篇.htaccess基础中提到了很多有用的访问控制方法,其实通过Rewrite也能实现类似的功能,而且可以更强大!
1.文件访问控制
之前利用Order、Files及FilesMatch命令实现的访问控制可以满足大部分要求,但是当用户被拒绝时,他们看到的是硕大的“403 Forbidden”,如果你不想伤害用户的感情,就需要显示一些别的东西,通过Rewrite就可以实现这个特性:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !^(.+)\.css$
RewriteCond %{REQUEST_FILENAME} !^(.+)\.js$
RewriteCond %{REQUEST_FILENAME} !special.zip$
RewriteRule ^(.+)$ /chat/ [NC]
该规则将仅允许用户请求.css, .js类型的文件,还有special.zip文件
RewriteRule 后面指定了限制规则:映射到/char/目录下处理
RewriteCond 后面的“感叹号”(!)起到了“否定”作用,它表明,对不满足后面正则表达式者应用RewriteRule规则,也就是对当前类型的文件将不应用规则
RewriteCond 之间是以逻辑“与”连接的,也就是只有当三个条件都不满足时才执行RewriteRule
该规则也会限制访问.htm, .jpg等格式
该规则不可以放在虚拟站点根目录(/)下,否则会死循环
如果是二级目录,如/test/,那么传入RewriteCond的参数是以/test/开始的,因此从(.+)获得的文件名也含有/test/,读者必须对此多加小心
要想仅获得文件名,可以将(.+)替换成([^/]+),并且去掉符号^,如下所示:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !([^/]+)\.css$ RewriteCond %{REQUEST_FILENAME} !([^/]+)\.js$ RewriteRule ^(.+)$ /chat/ [NC]
2.用.htaccess阻止User-agent
什么是User-agent?User-agent用于浏览器向服务器“自报家门”,更确切的说是所有HTTP客户端都得用User-agent向 服务器“自报家门”,以便服务器对不同的客户端作出不同响应。比如,某站点可能需要对浏览器、搜索引擎crawl还有各类下载工具作出不同的响应。服务器 就是通过所谓的User-agent进行区分的。
如果你的服务器提供某些资源的下载,那么你就必须多加小心诸如“迅雷”等下载软件,因为它们可能把你网站资源吸干,并且影响你的正常访客访问。为此,我们可以利用Rewrite限制某些UA的访问:
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} 2.0.50727 [NC]
RewriteRule . abuse.txt [L]
该规则限制“迅雷”客户端下载资源,并将下载文件重置到abuse.txt
HTTP_USER_AGENT是Apache的内置变量
2.0.50727是迅雷User-agent的特征字符串
RewriteRule后面的“点”表示“任意URI”,也就是不管请求的是什么,都输出abuse.txt
通常,我们不会仅限制一个UA。利用[OR]即可实现对多个UA作出统一处理:
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} 2.0.50727 [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^BlackWidow [NC,OR]
# etc..
RewriteCond %{HTTP_USER_AGENT} ^Net\ Vampire [NC]
RewriteRule . abuse.txt [L]
3.用.htaccess阻止盗链(hot-linking)
盗链,特别是图片,是非常可耻的!哪怕将图片复制到自己服务器上,也比盗用他人的图片链接来得光彩!(吐糟完毕)
.htaccess的Rewrite功能可以提供非常简单、有效的方法阻止这种可耻行为:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?lesca\.me/ [NC]
RewriteCond %{REQUEST_URI} !hotlink\.png [NC]
RewriteRule .*\.(gif|jpg|png)$ /hotlink.png [NC]
简单解释一下该规则的功能:
除本站以外其他网站都不得引用本站图片,具体可以理解为
如果引用站点为“空”或者是“本站”,或者,所引用对象是“hotlink.png”,那么就允许访问
再次提醒,RewriteCond之间默认的逻辑连接词是逻辑“与”
这里的难点是理解逻辑转换,即德·摩根定律
References:
[1] more .htaccess tips and tricks..
[2] Stupid htaccess Tricks
[3] QSA Flag
[4] 5 useful url rewriting examples using .htaccess
2. Laravel视图View和路由Route初探 - Laravel从零开始教程
在程序界最熟悉的莫过于"Hello World",通过输出"Hello Word",我们能了解路由和最基础的视图,这一小节,我们主要是学习下如何创建路由,如何加载视图,这节非常简单,跟着做就行。
上一节我们通过laravel new 项目名
安装了Laravel 5.3
的框架(默认安装最新版本的框架), 因为5.3的目录结构稍许有点变化,我们再安装一个laravel 5.2
的框架,通过5.2版本来演示。
➜ cd /usr/local/var/www # 进入到我们想要安装Laravel5.2框架的路径
➜ laravel new Laravel52 --5.2 #通过Laravel install工具安装Laravel 5.2
然后,进入Laravel52 目录,用sublime打开Laravel52项目
➜ cd Laravel52
➜ subl .
打开如下:
如果是第一次接触Laravel框架,面对着这么多已经存在的目录,肯定是有点不知所措的,比如说app
目录下的Providers,Policies等,这么文件夹的作用是什么呢?我们刚开始学的时候,不用想着一下子全弄明白,可以从最基础的开始,只要我们可以用Laravel去做点什么的时候,边做边学,那就不会觉得Laravel框架不易上手了。
ok,下面我们就来看下路由,打开app->Http->route.php
,通过route这个名字我们就知道路由(url)文件应该写在这里,所有的HTTP请求我们都会通过这个文件来分发出去。
当我们打开route.php
文件的时候,里面自带了这样的一个函数:
Route::get(''/'', function () {
return view(''welcome'');
});
上面这句代码我们使用了Route
这个类的get
方法,并传入两个参数给它,第一个参数是我们要设置的uri,这里我们定义成/
,通常都是访问到网站的主页,第二个参数是一个闭包函数,当然在正式开发的时候我们传入的第二个参数都是一个控制器类加上该类中的一个方法,如:
Route::get(''/'', ''PagesController@home''); #PagesController是一个控制器类,home是该类下面的一个方法。
我们暂时不去考虑控制器类,这不是本节要学习的内容,我们还是回头来看上面的闭包函数中的这句话:
return view(''welcome'');
这里的view()
函数,就可以对应我们要显示的视图层了,当中的welcome
是视图文件的名称,我们可以在resources->views
下找到welcome.blade.php
这个文件,该文件就是上面代码要显示的view层页面了,那么上面的代码的意思就是下面这样的:
return view(''welcome.blade.php'');
当然上面这样的代码运行时是会报错的,laravel运行view(''welcome'')
函数的时候,会自动去找welcome.blade.php
这个视图文件,所以我们书写的时候,只需要写上.blade.php前面的单词即可。那么这里也许有人会有疑问,为什么视图文件要取名为xxx.blade.php
呢,那是因为laravel的视图页面是使用blade
模版引擎的,所以必须加上.blade.php的后缀,那什么是balde模版呢,这样说吧,你应该知道一个老掉牙的smarty模版吧,嗯,这样说你应该明白了。
我们打开welcome.blade.php
文件,发现里面都是一些html代码,当然我们是可以在这个文件中书写php代码的,该文件默认的内容如下:
<!DOCTYPE html>
<html>
<head>
<title>Laravel</title>
<link href="https://fonts.googleapis.com/css?family=Lato:100" rel="stylesheet" type="text/css">
<style>
html, body {
height: 100%;
}
body {
margin: 0;
padding: 0;
width: 100%;
display: table;
font-weight: 100;
font-family: ''Lato'', sans-serif;
}
.container {
text-align: center;
display: table-cell;
vertical-align: middle;
}
.content {
text-align: center;
display: inline-block;
}
.title {
font-size: 96px;
}
</style>
</head>
<body>
<div>
<div>
<div>Laravel 5</div>
</div>
</div>
</body>
</html>
从上面的页面我们可以看出,这个页面就是显示一下Laravel 5
这几个文字,我们下面就来运行一下Laravel, 还是打开终端,进入到我们的项目Laravel52
目录中,然后我们执行php artisan serve
命令
我们打开浏览器,输入http://localhost:8000/
我们的laravel第一个页面是跑起来了,但是肯定有人会对php artisan serve
这条命令不理解,很多phper做php项目的时候都是写完代码,然后通过浏览器或者使用postman一阵调试,很少会使用到php的命令行模式。
如果用过php命令行模式,就不难理解,最简单的来说,我们查看php的版本php -v
, 我们启用php的内置web服务器php -S
,我们在命令行运行一段php代码php -r "echo ''Hello World'';"
, 或者我们在命令行运行一个php文件php -f "my_script.php"
,而php artisan
则是一个更加强大的命令行工具.我们可以执行下php artisan
这条命令,它会帮我们列举出artisan
的命令,都有对应的英文解释,这里大家一定要去先看看,了解一下,因为以后我们会经常用到这个artisan
,你会发现它是多么的强大,多么的好用.
到现在为止,我们几乎还没有写过一句代码,下面我们来尝试写一段,打开route.php
文件, 我们修改一下之间的代码如下:
Route::get(''/'', function () {
return ''Hello World'';
});
在Laravel中,我们可以返回view()
,也可以直接返回一个字符串到页面上,我们打开浏览器,还是输入http://localhost:8000/ 这时我们就能看见页面输出了久违的Hello World
了。(如果你关闭了php内置的web服务器,你还需要用终端在项目根目录下执行php artisan serve 命令来启动php的内置web服务器 )
那么如果我们想要定义一个http://localhost:8000/about
的路径呢,我们可以这么写:
Route::get(''about'', function () {
return ''About Page'';
});
打开浏览器,输入http://localhost:8000/about
页面就能显示About Page的这几个文字了。
下面,我们来试下使用view()
,将函数改成下面这样:
Route::get(''about'', function () {
return view(''about'');
});
然后,我们需要到resources->views
目录下新建一个about.blade.php
的文件,我们可以复制welcome.blade.php
文件中的内容,然后将
<div>Laravel 5</div>
改成
<div>About Page</div>
上面的代码是肯定能运行的,这里我就不截图了,通常情况下,我们的视图文件都会分类放在某一个文件夹下面,而不会直接放在resources/views
目录下,比如说我们的路径是这样的resources/views/pages/about.blade.php
那么我们的路由文件中应该这么写:
Route::get(''about'', function () {
return view(''pages.about''); # 这里的pages代表目录,about是代表文件
});
当然了,你也可以这么写:
Route::get(''about'', function () {
return view(''pages/about''); # 这里的pages代表目录,about是代表文件
});
不过laravel官方是推荐我们view(''pages.about'');
这么写,这样代码看上去会美观很多。
好了,我们刷新下浏览器
好了,到现在我们已经学习了Laravel的路由和视图的一些东东了,本节到这里结束了。
从零开始学Laravel教程目录
2.反转函数url_for与重定向redirect
在flask中,我们导入url_for
和redirect
两个函数。
from flask import Flask, url_for, redirect
首先看url_for
,简单来说,这个函数接受视图函数的名字(字符串形式)作为参数,返回视图函数对应的url
,例如:
@app.route(''/'')
def hello_world():
print(url_for(''index''))
return ''Hello World''
@app.route(''/index/'')
def index():
return ''index''
在hello_world
函数中使用print(url_for(''index''))
,将会打印出/index/
。
有传参的视图函数怎么办?同样将函数名字符串作为第一个参数,将参数以key=value
的形式写在后面,如:
@app.route(''/'')
def hello_world():
print(url_for(''hello'',name=''harp''))
return ''Hello World''
@app.route(''/<name>/'')
def hello(name):
return ''Hello %s'' % name
打印结果为/harp/
。
redirect
则更简单,功能就是跳转到指定的url
,大部分情况下,我们都是和url_for
一起使用的,例如:
@app.route(''/'')
def hello_world():
return ''Hello World''
@app.route(''/<name>/'')
def hello(name):
if name == ''Harp'':
return ''Hello %s'' % name
else:
return redirect(url_for(''hello_world''))
在hello
这个视图函数中,如果url
传入的参数是Harp
(即请求的网址是http://127.0.0.1:5000/Harp/),则返回''Hello Harp''
,其他情况则重定向到hello_world
这个视图函数对应的网址''/''
。
302临时重定向(temporaryredirect)
302重定向也被以为是暂时重定向,一条对网站阅览器的指令来显现阅览器被要求显现的不同的URL,当一个网页经历过短期的URL的改变时运用,一个暂时重定向是一种效劳器端的重定向,可以被查找引擎蜘蛛正确地处理。
今天关于你会使用Laravel视图view()与重定向redirect()吗?和laravel view的分享就到这里,希望大家有所收获,若想了解更多关于.htaccess技巧: URL重写(Rewrite)与重定向(Redirect)、2. Laravel视图View和路由Route初探 - Laravel从零开始教程、2.反转函数url_for与重定向redirect、302临时重定向(temporaryredirect)等相关知识,可以在本站进行查询。
本文标签: