【问题标题】:htaccess rewrite - prevent multiple redirectshtaccess 重写 - 防止多次重定向
【发布时间】:2013-11-14 02:23:26
【问题描述】:

除了用户访问examplesite1.com/site1 的情况外,以下正则表达式完美运行。发生这种情况时,页面会因为多次重定向而失败,在这些重定向中,它会继续将request=site1 查询添加到 URL。我认为添加RewriteCond %{ENV:REDIRECT_STATUS} ^$ 可以解决此问题,但似乎并非如此。

此设置适用于多域网站。共有三个文件夹site1、site2 和shared。 site2 和 shared 的重写规则也没有显示,因为它们不会影响此问题。

# if the resource exists in site1 return it to the user
RewriteCond %{HTTP_HOST} examplesite1.com$
RewriteCond %{DOCUMENT_ROOT}/site1/%{REQUEST_URI} -f
RewriteRule ^(.*)$ /site1/$1 [QSA,L]

# no file found, send URI to CMS
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php?request=$1 [QSA,L]

完整的 .htaccess 文件:

AddDefaultCharset UTF-8
# Disallow browsing file directories
Options -Indexes 

RewriteEngine on
RewriteBase /

#remove the trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} (.*)/$
RewriteRule ^(.+)/$ /$1 [R=301,L]

RewriteCond %{HTTP_HOST} examplesite1.com$
RewriteCond %{DOCUMENT_ROOT}/site1/%{REQUEST_URI} -f
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(.*)$ /site1/$1 [QSA,L]

RewriteCond %{HTTP_HOST} examplesite2.com$
RewriteCond %{DOCUMENT_ROOT}/site2/%{REQUEST_URI} -f
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(.*)$ /site2/$1 [QSA,L]

RewriteCond %{DOCUMENT_ROOT}/shared/%{REQUEST_URI} -f
RewriteRule ^(.*)$ /shared/$1 [QSA,L]

# resources not to be public are sent to CMS
RewriteCond %{REQUEST_FILENAME} (\.inc\.|\.tpl$)
RewriteRule ^(.*)$ /index.php?request=$1 [QSA,L]

# no resource found, send URI to CMS
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(.*)$ /index.php?request=$1 [QSA,L]

【问题讨论】:

    标签: regex apache .htaccess mod-rewrite url-rewriting


    【解决方案1】:

    尝试添加一个额外的条件:

    RewriteCond %{HTTP_HOST} examplesite1.com$
    RewriteCond %{REQUEST_URI} !^/site1/
    RewriteCond %{DOCUMENT_ROOT}/site1/%{REQUEST_URI} -f [OR]
    RewriteCond %{DOCUMENT_ROOT}/site1/%{REQUEST_URI} -d
    RewriteRule ^(.*)$ /site1/$1 [QSA,L]
    

    这里可能发生的情况是,您需要防止在应用其他规则之一后发生重定向。尝试在正下方添加RewriteBase /:

    RewriteCond %{ENV:REDIRECT_STATUS} 200
    RewriteRule ^ - [L]
    

    【讨论】:

    • 可悲的是,在根目录中进行了重写循环。此外,在将其还原后,它缓存了重写,因此我无法测试其他选项,我不确定为什么会发生这种情况。
    • @michaellindahl 重写不会被缓存,重定向会(通过您的浏览器),除非您通过代理服务器访问它。如果其他地方还有其他规则,显然这些是整体问题的一部分
    • 感谢您的快速回复。如果有帮助,我已经添加了完整的 .htaccess 文件,但我相信我已经很好地抽象了它。这些重定向是否默认为 301?我可以在不向最终用户显示的情况下将它们更改为 302 吗?如何阻止我的浏览器 (Safari) 缓存重定向。
    猜你喜欢
    • 2012-08-20
    • 2017-03-11
    • 2023-03-18
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多