无法访问放置在根文件夹中的 yii2 项目中的站点地图

Posted

技术标签:

【中文标题】无法访问放置在根文件夹中的 yii2 项目中的站点地图【英文标题】:Cannot access sitemap in yii2 project placed in root folder 【发布时间】:2022-01-16 19:13:43 【问题描述】:

我为我的 yii2 项目创建了一个 sitemap.xml。我将它放在根文件夹中,但我似乎无法使用此 URL 访问它:https://www.mywebsite.com/sitemap.xml。我需要将 URL 输入到 Google Search Console。

我到处搜索,但似乎关于 yii2 和站点地图的信息非常少。

放置sitemap.xml 的正确方法是什么?我相信它可以在 htaccess 文件中修复,但我不知道如何。

Options +FollowSymlinks
RewriteEngine On

# deal with backend first
RewriteCond %REQUEST_URI /(backend)
RewriteRule ^backend/assets/(.*)$ backend/web/assets/$1 [L]
RewriteRule ^backend/css/(.*)$ backend/web/css/$1 [L]
RewriteRule ^backend/font/(.*)$ backend/web/font/$1 [L]
RewriteRule ^backend/plugins/(.*)$ backend/web/plugins/$1 [L]
RewriteRule ^backend/images/(.*)$ backend/web/images/$1 [L]
RewriteRule ^backend/img/(.*)$ backend/web/img/$1 [L]
RewriteRule ^backend/js/(.*)$ backend/web/js/$1 [L]
RewriteRule ^backend/app-assets/(.*)$ backend/web/app-assets/$1 [L]

RewriteCond %REQUEST_URI !/backend/web/(assets|css|font|plugins|images|img|js|app-assets)/
RewriteCond %REQUEST_URI /(backend)
RewriteRule ^.*$ backend/web/index.php [L]


RewriteCond %REQUEST_URI /(assets|css|js|img|font|uploads)
RewriteRule ^assets/(.*)$ frontend/web/assets/$1 [L]
RewriteRule ^css/(.*)$ frontend/web/css/$1 [L]
RewriteRule ^js/(.*)$ frontend/web/js/$1 [L]
RewriteRule ^img/(.*)$ frontend/web/img/$1 [L]
#RewriteRule ^uploads/(.*)$ frontend/web/uploads/$1 [L]
RewriteRule ^uploads/(.*)$ uploads/$1 [L]

RewriteCond %REQUEST_URI !/(frontend|backend)/web/(assets|css|js|img|images|font|fonts|uploads|plugins|app-assets)/
RewriteCond %REQUEST_URI !index.php
RewriteCond %REQUEST_FILENAME !-f [OR]
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^.*$ frontend/web/index.php

<IfModule mod_expires.c>
  ExpiresActive On

 # Images
  ExpiresByType image/jpeg "access plus 1 year"
  ExpiresByType image/gif "access plus 1 year"
  ExpiresByType image/png "access plus 1 year"
  ExpiresByType image/webp "access plus 1 year"
  ExpiresByType image/svg+xml "access plus 1 year"
  ExpiresByType image/x-icon "access plus 1 year"

  # Video
  ExpiresByType video/webm "access plus 1 year"
  ExpiresByType video/mp4 "access plus 1 year"
  ExpiresByType video/mpeg "access plus 1 year"

  # Fonts
  ExpiresByType font/ttf "access plus 1 year"
  ExpiresByType font/otf "access plus 1 year"
  ExpiresByType font/woff "access plus 1 year"
  ExpiresByType font/woff2 "access plus 1 year"
  ExpiresByType application/font-woff "access plus 1 year"

  # CSS, javascript
  ExpiresByType text/css "access plus 1 month"
  ExpiresByType text/javascript "access plus 1 month"
  ExpiresByType application/javascript "access plus 1 month"

  # Others
  ExpiresByType application/pdf "access plus 1 month"
  ExpiresByType image/vnd.microsoft.icon "access plus 1 year"
</IfModule>

# php -- BEGIN cPanel-generated handler, do not edit
# Set the “ea-php72” package as the default “PHP” programming language.
<IfModule mime_module>
  AddHandler application/x-httpd-ea-php72 .php .php7 .phtml
</IfModule>
# php -- END cPanel-generated handler, do not edit

试图解决这个问题已经数周没有成功。请帮忙。

【问题讨论】:

“我似乎无法访问它” - 会发生什么?你得到什么回应? (也许是您框架中的 404?) 【参考方案1】:
RewriteCond %REQUEST_FILENAME !-f [OR]
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^.*$ frontend/web/index.php

您需要在上述条件下删除OR 标志,否则此表达式(不是文件或不是目录)将始终为真并请求sitemap.xml(或任何其他尚未在上述条件中排除的静态资源)将被路由到frontend/web/index.php

这两个否定条件应该是隐式AND'd,而不是OR'd。

【讨论】:

【参考方案2】:

我可以很好地使用一些“动态”: 你可以制作一个像frontend\controllers\SitemapController 这样的新控制器,并在“FORMAT_RAW”中提供它。

另外 - 'sitemap.xml' => 'sitemap/index',在 urlManager 中。 (控制器/视图)

【讨论】:

【参考方案3】:

感谢您的回答。不过解决方法其实很简单,我刚刚才发现。

我将我的 sitemap.xml 文件移动到 frontend/web 文件夹,它可以工作。

【讨论】:

以上是关于无法访问放置在根文件夹中的 yii2 项目中的站点地图的主要内容,如果未能解决你的问题,请参考以下文章

yii2 部署服务器

Yii2 Nginx Elastic Beanstalk 上的高级模板

无法访问 virtualenv 中的系统站点包

Yii 包访问 url 中的文件

在yii2中的会话工作地点

WAMP 中的 Web 服务器根目录在哪里?