当项目位于子目录

时间:2017-10-24 10:13:04

标签: php laravel .htaccess mod-rewrite web

当Laravel项目位于子目录中时,我目前在使用.htaccess文件重写URL时出现问题。

通常不在子目录中时/ vacancies - > /index.php/vacancies使用以下.htcaccess文件工作。

<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>

RewriteEngine on

RewriteLog "/var/log/httpd/rewrite.log"
RewriteLogLevel 3

# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]

# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^index.php [L]

# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

虽然现在项目存在于一个子目录中,但我要求将URL重写为/ vacancies - &gt; /abc/index.php/vacancies。

主页正常工作,但任何链接只返回一个未找到的错误。

我需要进行哪些更改才能让.htaccess文件为我执行此操作。

所以在进入&rs; index.php&#39;后进一步调查进入网址本身页面加载正确,如果这有助于回答问题。

谢谢!

5 个答案:

答案 0 :(得分:1)

我不会修改Laravel应用中提供的默认.htaccess。您需要在站点的虚拟主机配置文件中使用Apache的目录别名。您需要具有以下格式:

#Change the paths accordingly
Alias /vacancies /path/to/app/public

<Directory /path/to/app/public>
    Options Indexes FollowSymLinks Includes ExecCGI
    AllowOverride All
    Order allow,deny
    Allow from all
    Require all granted #If using Apache 2.4 add this.
</Directory>

答案 1 :(得分:1)

我设法解决了这个问题,感谢您的建议,结果证明这是虚拟主机文件的问题以及项目的创建地点,因为我有软链接让我们直接指向apache。

因此,Apache正在查看虚拟主机文件中设置的实际项目位置,而不是用于导致未找到问题的软链接。

答案 2 :(得分:0)

如果您使用的是apache,请检查apache httpd配置文件中的.ht *权限。我有同样的问题,我有权限被拒绝.htaccess文件的问题。如果您在共享主机上,请尝试联系托管支持。

答案 3 :(得分:0)

试过把它放在htaccess文件的顶部?在某种情况下帮助我,看起来很奇怪但确实如此。

答案 4 :(得分:0)

我注意到你已经设法“修复”了这个问题。但是,您发布的.htaccess文件中存在一些基本错误,因此我不确定这是如何正常工作的?

RewriteLog "/var/log/httpd/rewrite.log"
RewriteLogLevel 3

这两个指令在.htaccess文件中无效,因此会导致500内部服务器错误。这些只能直接在服务器配置或虚拟主机上下文中使用。这些也是Apache 2.2指令,因此不适用于Apache 2.4。

RewriteRule ^index.php [L]

(“前控制器”的一部分)。您在第一个和第二个参数之间缺少空间,因此无法重写对index.php - 您的“前端控制器”的任何请求。 (也许这只是一个错字,但很难看到像这样的拼写错误?)例如,这应该更像:

RewriteRule ^ index.php [L]
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

这些指令应该在前控制器之前,而不是在文件的末尾。否则,它们不会针对通过框架路由的任何请求执行。

  

当不在具有/空缺的子目录中时 - > /index.php/vacancies使用以下.htcaccess文件工作

实际上并不是上面.htaccess代码的作用。它应该只是将请求重写为/index.php。 (然后frawework / Laravel会查看所请求的完整URL。)如果它将URL重写为/index.php/vacancies(某些框架会这样做),那么您需要使用路径名信息来读取URL (PATH_INFO)。

  

虽然现在项目存在于子目录中,但我要求将URL重写为/vacancies - &gt; /abc/index.php/vacancies

请参阅上文有关PATH_INFO的内容。但是,如果.htaccess文件位于站点的文档根目录中,并且/abc子目录应该完全隐藏,那么您仍有一些工作要做。您需要设置适当的RewriteBase并修改从非目录中删除尾部斜杠的条件。

否则,如果/abc目录是URL的一部分,那么.htaccess文件可以移动到/abc子目录,但是您仍然需要修改删除的指令尾随斜线。