文件夹中的Laravel .htaccess配置

时间:2018-12-05 09:40:26

标签: php laravel apache .htaccess

情况:Web项目,这是文件夹结构。

  • www
    • 2015
    • 2016
    • 2017
    • 2018
    • 当前

每个文件夹代表该年的网站,在“当前”文件夹中,当您访问www.mydomain.com时应显示该网站。 目标是,如果您访问www.mydomain.com/2017,则会看到2017年的网站。

根文件夹中有一个.htaccess文件,该文件可确保如果导航到“ /”,则将您重定向到当前文件。

我在必须放入“ 2017”文件夹(这是laravel应用程序)的.htaccess文件中挣扎。

www文件夹中的.htaccess文件

<IfModule mod_rewrite.c>
   Options +SymLinksIfOwnerMatch
   RewriteEngine on

   RewriteRule ^(.*)$ current/$1 [L]
</IfModule>

.htaccess文件位于2017文件夹中

<IfModule mod_rewrite.c>
   Options +SymLinksIfOwnerMatch
   RewriteBase /2017
   RewriteEngine on
   RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

当前结果:当我访问www.mydomain.com/2017时,我转到2017文件夹,但它转到2017年的“ 2017”页面。要对此进行测试,我将其添加到了我的web.php路由中:

Route::get('/{page}', array('as'=>'renderpage',function ($page) {
    dd('I am here and the page you request is '.$page);
}));

其结果是: “我在这里,您要求的页面是2017年”

长话短说:我如何从.htaccess文件的url中删除“ 2017”,以便laravel将www.mydomain.com/2017解释为2017文件夹的根。最好在2017文件夹的.htaccess文件中完成此操作。

编辑: 我将2017文件夹中的.htaccess文件更改为此:

<IfModule mod_rewrite.c>
   Options +SymLinksIfOwnerMatch
   RewriteBase /2017
   RewriteEngine on
   RewriteRule ^(/.*|)$ public/$1 [L,NC,R=301]
</IfModule>

现在它可以工作了,除了在URL中,您现在看到www.mydomain.com/2017/public 如何从网址中删除“公开”?

2 个答案:

答案 0 :(得分:0)

也许这是在laravel中做的正确方法:

您可以使用以下方法更改控制器中的根目录或路由

$this->app->bind('path.public', function() {
  return base_path().'/public_html';
});

我猜你可以在其中插入一个绝对路径。

退房

https://laravel.com/docs/5.7/helpers#method-public-path

https://laravel.com/docs/5.7/helpers#method-base-path

答案 1 :(得分:0)

无需触摸laravel代码,但使用nginx配置:

server {
    listen *:8080;
    server_name 2016.test.test;

    root /var/www/html/2016;
    index index.html index.php;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        fastcgi_index   index.php;
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
    }
} 

 server {
    listen                *:80;

    server_name           www.test.test;
    client_max_body_size 1m;

    root /var/www/html/current;
    index  index.html index.htm;

    location /2016/ {
        rewrite /2016/(.*) /$1 break;

        proxy_pass          http://2016.test.test:8080;
        proxy_redirect      off;
        proxy_set_header    Host $host;
    }
}

文件夹结构:

.
├── 2015            
│   └── index.html  
├── 2016            
│   ├── index.html  
│   └── index.php   
├── 2017            
│   └── index.html  
├── current         
│   ├── index.html  
│   └── test.html   
└── index.html

index.php:

 <?php
     var_dump($_SERVER);
 ?> 

结果调用:  http://www.test.test/2016/sample/foo/bar  ...

  ...
  'SCRIPT_FILENAME' => string '/var/www/html/2016/index.php' (length=28)
  'REDIRECT_STATUS' => string '200' (length=3)
  'SERVER_NAME' => string '2016.test.test' (length=14)
  'SERVER_PORT' => string '8080' (length=4)
  'SERVER_ADDR' => string '127.0.0.1' (length=9)
  'REMOTE_PORT' => string '48598' (length=5)
  'REMOTE_ADDR' => string '127.0.0.1' (length=9)
  'SERVER_SOFTWARE' => string 'nginx/1.14.0' (length=12)
  'GATEWAY_INTERFACE' => string 'CGI/1.1' (length=7)
  'REQUEST_SCHEME' => string 'http' (length=4)
  'SERVER_PROTOCOL' => string 'HTTP/1.0' (length=8)
  'DOCUMENT_ROOT' => string '/var/www/html/2016' (length=18)
  'DOCUMENT_URI' => string '/index.php' (length=10)
  'REQUEST_URI' => string '/sample/foo/bar' (length=15)
  'SCRIPT_NAME' => string '/index.php' (length=10)
  ...

您看到 REQUEST_URI 只是'/ sample / foo / bar'而没有年份

此示例的编码为2016年,您可以轻松地在年份中使用一些正则表达式,例如:20[0-9]{2},然后将匹配项替换为适当的变量($ 1或类似的值)