我正在尝试让 Laravel 项目在遗留站点中运行,同时我们致力于使整个代码库现代化。我已经能够使用 valet 创建自定义代客驱动程序使其在我的开发计算机中工作,但我正在努力将 apache 配置为以相同的方式工作。
我在 apache 上的虚拟主机配置看起来像(已编辑):
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName "xxxxxxxxxxx:443"
UseCanonicalName Off
DocumentRoot "/var/www/xxxx/dev"
CustomLog /var/log/apache2/xxxx/logs/dev_access_ssl_log combined
ErrorLog "/var/log/apache2/xxxx/logs/dev_error_log"
Alias /laravel /var/www/xxxx/dev/laravel/public
<Directory /var/www/xxxx/dev>
SSLRequireSSL
Options -Includes -ExecCGI
</Directory>
<Directory /var/www/xxxx/dev>
Options +FollowSymLinks
</Directory>
DirectoryIndex "index.html" "index.cgi" "index.pl" "index.php" "index.xhtml" "index.htm" "index.shtml"
<Directory /var/www/xxxx/dev>
AllowOverride All
# AuthConfig FileInfo Indexes Limit Options=Indexes,SymLinksIfOwnerMatch,MultiViews,FollowSymLinks,ExecCGI,Includes,IncludesNOEXEC
</Directory>
<Directory /var/www/xxxx/laravel/public>
AllowOverride All
</Directory>
</VirtualHost>
</IfModule>
(已编辑) 我更改了项目结构,恢复了公共目录的默认位置,并且在我的 Valet 配置中再次正常工作。
这是 /laravel/public 目录中的 .htaccess 文件:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
RewriteBase /laravel
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
我添加了与 laravel 标准 htaccess 文件不同的 RewriteBase 指令,以便使所有请求保留在 /laravel (这是每个虚拟主机文件中 /laravel/public 的别名)
每当我尝试访问 /laravel/admin (这是 /routes 下的 web.php 文件中配置的路由)之类的内容时,我仍然会收到 404 错误(刀片样式)。 我很确定我搞砸了重写和重定向,但我在没有任何进展的情况下一直在努力。
令我完全困惑的是,在 Valet 上只需要 10 行代码:
public function frontControllerPath(string $sitePath, string $siteName, string $uri):string
{
$ext = pathinfo($uri, PATHINFO_EXTENSION);
if($ext != '') {
return $uri = $sitePath.$uri;
} else {
if($uri == '/') {
return $sitePath.'/index.php';
} elseif (str_contains($uri,'/laravel')) {
return $sitePath.'/laravel/public/index.php';
}
else {
return $uri == '/admin/' ? $sitePath . '/admin/index.php' : $sitePath. $uri . '.php';
}
}
}
事实证明这不是重写问题。 或者更好的是,确实如此,但这不是真正的问题。
将项目重构为标准项目后,我必须稍微调整主遗留项目中的 .htaccess 文件,并创建一个 laravel.php 文件,该文件仅包含公共 Laravel 项目中原始 index.php 的 require_once 。
主要问题是两个View组件拼写错误,没有第一个大写字母,所以基本上刀片找不到它们。