【问题标题】:Laravel : How to redirect my main domain to a subfolder in public?Laravel:如何将我的主域重定向到公共子文件夹?
【发布时间】:2020-01-31 04:25:33
【问题描述】:

我有一个 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>

我可以像这样删除public

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

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

【问题讨论】:

  • 看起来与这个最近的问题非常相似...stackoverflow.com/questions/59937631/…
  • 您的服务器应配置为将文档根目录设为公用文件夹,而不是应用程序根目录。这样做是出于安全原因。一旦您将服务器配置为在 public 目录之外为应用程序提供服务,将重定向添加到子目录应该很简单。
  • 我不完全清楚你需要什么。 VS。内容实际位于何处?您希望在地址栏中显示该内容的哪个地址?文件夹里的内容是/public/english,但是你想让地址栏显示/english ? (我离开了https://example.com 舞会,只显示相对地址?)

标签: laravel .htaccess redirect


【解决方案1】:

一、重定向和重写的区别:

重定向:更改浏览器地址栏中的 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>

但是内容实际上并不存在,所以现在,一旦新请求通过,我们会在服务器端内部重写该请求,以将请求定向到内容的实际位置:

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

您应该能够将其组合成一个 &lt;IfModule&gt; .. &lt;/IfModule&gt; 代码块。

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


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

  1. 浏览器请求页面
  2. 服务器以重定向状态代码响应
    (301:永久,302:找到,303:查看其他,307:临时)
  3. 浏览器向新 URL 发出第二次请求
  4. 服务器响应新 URL

重写:服务器端(因此浏览器栏不会改变)

  1. 浏览器请求页面
  2. URL Rewrite 重写 URL 并请求更新页面

【讨论】:

    猜你喜欢
    • 2018-09-13
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多