Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel:如何将我的主域重定向到公共的子文件夹?_Laravel_.htaccess_Redirect - Fatal编程技术网

Laravel:如何将我的主域重定向到公共的子文件夹?

Laravel:如何将我的主域重定向到公共的子文件夹?,laravel,.htaccess,redirect,Laravel,.htaccess,Redirect,我有一个Laravel项目,我希望我的主域被重定向到公用文件夹中的子文件夹,但我不希望URL中的public 例如,当我键入example.com时,我希望自动重定向到example.com/english 我知道我可以将example.com重定向到example.com/public/english如下: <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_HOST} ^(www.)?examp

我有一个Laravel项目,我希望我的主域被重定向到公用文件夹中的子文件夹,但我不希望URL中的
public

例如,当我键入
example.com
时,我希望自动重定向到
example.com/english

我知道我可以将
example.com
重定向到
example.com/public/english
如下:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^(www.)?example.com$
    RewriteCond %{REQUEST_URI} !^/public/english/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ public/english/$1 [L]
    RewriteCond %{HTTP_HOST} ^(www.)?example.com$
    RewriteRule ^(/)?$ public/english/ [L]
</IfModule>
<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_URI} !^public/
    RewriteRule ^(.*)$ public/$1 [L] #relative substitution
</IfModule> 

但是如何将两者结合起来呢?

首先,重定向和重写之间的区别:

重定向:更改浏览器地址栏中的URL

重写:浏览器地址栏中的URL不会更改

RewriteRule
上的
[R]
标志使其成为重定向。此外,如果主机发生更改,它将是一个重定向。否则,这是一次重写

因此,第1步可能是设置地址栏中的内容,客户端:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^(www.)?example.com$
    RewriteCond %{REQUEST_URI} !^/english/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /english/$1 [R,L]
    RewriteCond %{HTTP_HOST} ^(www.)?example.com$
    RewriteRule ^(/)?$ /english/ [L]
</IfModule>

重新启动发动机
重写cond%{HTTP_HOST}^(www.)?example.com$
重写cond%{REQUEST_URI}^/英式/
重写cond%{REQUEST_FILENAME}-F
重写cond%{REQUEST_FILENAME}-D
重写规则^(.*)$/英文/$1[R,L]
重写cond%{HTTP_HOST}^(www.)?example.com$
重写规则^(/)?$/英语/[L]
但是内容实际上并不存在,所以现在,一旦新请求通过,我们将在服务器端内部重写该请求,以将请求定向到内容的实际位置:

<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_URI} !^public/
    RewriteRule ^(.*)$ public/$1 [L] #relative substitution
</IfModule> 

重写cond%{REQUEST_URI}^公开的/
重写规则^(.*)$public/$1[L]#相对替换
您应该能够将其组合成一个
代码块

除了
R
标志外,您还可以指示它是永久重定向还是临时重定向。默认情况下,它将是一个永久重定向(301状态代码)。我通常使用临时重定向
[R=302]
对其进行测试,以防出错,直到我确信一切都按预期进行


两种类型的页面流不同:
重定向:客户端-(因此浏览器的地址栏发生更改)

  • 浏览器请求一个页面
  • 服务器响应重定向状态代码
    (301:永久,302:已找到,303:见其他,307:临时)
  • 浏览器向新URL发出第二个请求
  • 服务器响应新的URL
  • 重写:服务器端(因此浏览器栏不会更改)

  • 浏览器请求一个页面
  • URL重写重写URL并请求更新页面

  • 看起来很像最近的这个问题。。。服务器应配置为使文档根目录为公用文件夹,而不是应用程序根目录。这样做是出于安全原因。一旦您将服务器配置为在
    public
    目录外为应用程序提供服务,那么将重定向添加到子目录应该很简单。我不完全清楚您需要什么。内容的实际位置是什么?您希望在地址栏中显示该内容的哪个地址?文件夹
    /public/english
    中的内容,但您希望地址栏显示
    /english
    ?(我把
    https://example.com
    prom,仅显示相对地址?)