php - 重定向 .htaccess 中的所有(子)路由并保留 url 在索引页面上导致错误 404
问题描述
我试图用域 B 屏蔽域 A 的特定路由(以及之后的所有子路由)。所以基本上如果有人访问“DomainB.com”,他应该被带到“DomainA.com/page/1”。当有人访问“DomainB.com/about”时,他应该被带到“DomainA.com/page/1/about”。但是,在浏览器中应该始终存在“DomainB.com/about”。
我通过在域 B 的根文件夹内的 .htaccess 中使用以下行来实现这一点:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^DomainB\.com$ [NC]
RewriteRule ^(.*)$ https://DomainA.com/page/1/$1 [P]
现在所有子路由(例如 DomainB.com/about)都可以正常工作。但是索引路由(DomainB.com)给了我一个错误 404,我不知道为什么。
我在这个项目中使用 Laravel 7。DomainA.com 的 htaccess 如下所示:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
RewriteBase /
# Allow access to font files for known hosts
<FilesMatch "\.(ttf|otf|eot|woff|woff2)$">
<IfModule mod_headers.c>
SetEnvIf Origin "http(s)?://(www\.)?(DomainB.com)$" AccessControlAllowOrigin=$0
Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
Header merge Vary Origin
</IfModule>
</FilesMatch>
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
# Gzip text compression
<IfModule mod_deflate.c>
# Compress HTML, CSS, JavaScript, Text, XML and fonts
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/xml
# Remove browser bugs (only needed for really old browsers)
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
Header append Vary User-Agent
</IfModule>
# Redirect to non-index.php url.
RewriteCond %{THE_REQUEST} ^.*/index\.php
RewriteRule ^index.php(.*)$ /$1 [R=301,L]
</IfModule>
我的 .htaccess 有什么问题吗?或者有没有办法保留我编写的规则并编写第二条规则,仅将索引路由重定向到“DomainA.com/page/1”?
干杯,保罗
解决方案
我找到了一种解决方法,但这对我来说不是理想的解决方案。
首先,我声明了一个名为“/index”的新路由,指向“/”路由指向的同一个函数。像这样:
Route::get('/index', 'PageController@index'); // the /page/{id} part is done in the group above with model binding
然后我将以下行添加到我的 .htaccess 中:
RewriteCond %{HTTP_HOST} DomainB\.com$ [NC]
RewriteCond %{REQUEST_URI} ^/$
Rewriterule ^(.*)$ https://DomainB.com/index [L,R=301]
这会将用户从 DomainB.com 重定向到 DomainB.com/index,这是可行的。但是,我不知道这是否是一个理想的解决方案,因为更改索引链接可能对 SEO 不利……这对 DomainA.com 上的 SEO 肯定不利,因为现在有多种方法可以访问索引页面。
推荐阅读
- f# - 如何实现策略模式以返回声明为私有的结构?
- c++ - Qt 应用程序部署不起作用。缺少入口点和 dll
- javascript - JavaScript:意外的结果得到该月剩余的天数
- java - 对android项目的结构和MVC模式感到困惑
- u-sql - 在 USQL 中解析多个日期时间
- angularjs - AngularJS 表单验证在表单外的 href 链接上触发
- java - Eclipselink jpa - sql查询结果映射到java对象
- python - Python difflib:difflib 的 htmldiff 将多行合二为一
- cassandra - 为什么在截断表之前将一致性设置为 ALL
- c++ - 使用 random_shuffle 的多个类的向量不会按预期进行混洗