Mod-Rewrite

使用 301 apache 從 https://domain.tld 多次重定向到 https://domain.tld/subdir/

  • June 12, 2019

我有 Apache2 的目前設置,讓我們加密移動

http://domain.tld => https://domain.tld
http://www.domain.tld => https://www.domain.tld

它的工作完美,

現在我想將我所有的域名訪問移動到一個子目錄

http://domain.tld => https://domain.tld/subdir ( Done! its working )

但是當我嘗試將 https 域名訪問重定向到子目錄時,我得到了多個重定向。

https://domain.tld => https://domain.tld/subdir ( Endless redirect to 
https://domain.tld/subdir/subdir/subdir/ and so on )

000-default-le-ssl.conf

<IfModule mod_ssl.c>
<VirtualHost domain.tld:443>
  ServerName domain.tld
  ServerAlias www.domain.tld

  DocumentRoot /var/www/domain.tld/html
  Redirect permanent / https://domain.tld/abc

  SSLCertificateFile /etc/letsencrypt/live/domain.tld/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/domain.tld/privkey.pem
  Include /etc/letsencrypt/options-ssl-apache.conf
  SSLCertificateChainFile /etc/letsencrypt/live/domain.tld/chain.pem

</VirtualHost>
</IfModule>

000-default.conf

<VirtualHost domain.tld:80>
  ServerName domain.tld
  ServerAlias www.domain.tld

  DocumentRoot /var/www/domain.tld/html

  # This works like a charm !( DONE! )
  Redirect 301 / https://domain.tld/roll-out/

# RewriteEngine on
# RewriteCond %{SERVER_NAME} =domain.tld [OR]
# RewriteCond %{SERVER_NAME} =www.domain.tld
# RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

我已經評論了最後 3 行,請幫助我理解為什麼會發生這種情況以及解決方案是什麼。

非常感謝!

<VirtualHost example.tld:443>
  ServerName example.tld
  Redirect permanent / https://example.tld/abc

https://httpd.apache.org/docs/2.4/mod/mod_alias.html#redirect :

然後任何以 URL-path開頭的請求都會在目標 URL 的位置向客戶端返回一個重定向請求。匹配的 URL 路徑之外的其他路徑資訊將附加到目標 URL。

通過使用“ /”作為 URL 路徑,“ /abc”目標 URL /abc 也將被匹配並被重定向到/abc/abc.

您可能想要的只是匹配裸域並將其重定向到 /abc,對嗎?

使用 aRedirectMatch代替:

RedirectMatch permanent ^/$ https://domain.tld/abc

引用自:https://serverfault.com/questions/971050