在我的根文件夹中,捕获以下内容https://example.org和http://example.org并重定向到其各自的版本(http 或 https),并重新添加 www。(这是他们对广告系统的要求。)
然而,问题在于,当子目录使用 PHP 中的 MVC 编码中常见的“将所有内容指向 index.php”技术时,它会完全忽略 www 规则。
我的问题是我需要创建子目录,即使它们具有 .htaccess,也要使用根 .htaccess 的规则进行 www 重定向。我该怎么做才能确保子目录 .htaccess 应用主目录的 www 规则,或者至少编辑子目录 .htaccess ?
# ROOT .htaccess FILE
RewriteEngine on
# IF HTTPS OFF AND NO WWW, REDIRECT TO HTTP://WWW.*
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^example.org$
RewriteRule ^(.*)$ http://www.example.org/$1 [R=301,L]
# IF HTTPS ON AND NO WWW, REDIRECT TO HTTPS://WWW.*
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^example.org$
RewriteRule ^(.*)$ https://www.example.org/$1 [R=301,L]
一些子目录中的一个看起来像:
# SUBDIR .htaccess FILE
Options All +FollowSymLinks -Indexes -Multiviews
# BLOCK ROBOTS AND SPIDERS FROM SCANNING CERTAIN FILES
IndexIgnore .htaccess *~ *.txt *.sql *.xml
# BLOCK SOME COMMON FILE TYPES FROM END USERS
<FilesMatch "\.(sql|xml|txt|htaccess)">
Deny from all
</FilesMatch>
<FilesMatch ".*~$">
Deny from all
</FilesMatch>
RewriteEngine On
# BESIDES BLOCKED FILES ABOVE, OR FILES WE PHYSICALLY HAVE IN THIS DIRECTORY,
# REDIRECT ALL OTHER OUTPUT TO index.php AND PASS ALL URL PARAMETERS IN FULL.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [QSA]
请注意,我在子目录 .htaccess 文件中尝试了类似的操作,但失败了 - 最终在子目录路径中出现了 404 错误。
# SUBDIR .htaccess FILE
Options All +FollowSymLinks -Indexes -Multiviews
# BLOCK ROBOTS AND SPIDERS FROM SCANNING CERTAIN FILES
IndexIgnore .htaccess *~ *.txt *.sql *.xml
# BLOCK SOME COMMON FILE TYPES FROM END USERS
<FilesMatch "\.(sql|xml|txt|htaccess)">
Deny from all
</FilesMatch>
<FilesMatch ".*~$">
Deny from all
</FilesMatch>
RewriteEngine On
# IF HTTPS OFF AND NO WWW, REDIRECT TO HTTP://WWW.*
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^example.org$
RewriteRule ^(.*)$ http://www.example.org/$1 [R=301,L]
# IF HTTPS ON AND NO WWW, REDIRECT TO HTTPS://WWW.*
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^example.org$
RewriteRule ^(.*)$ https://www.example.org/$1 [R=301,L]
# BESIDES BLOCKED FILES ABOVE, OR FILES WE PHYSICALLY HAVE IN THIS DIRECTORY,
# REDIRECT ALL OTHER OUTPUT TO index.php AND PASS ALL URL PARAMETERS IN FULL.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [QSA]
编辑:
例如...
我想去:
1 http://example.org/
2 http://www.example.org/
3 https://example.org/
4 https://www.example.org/
5 http://example.org/test/something.php
6 http://example.org/test/
7 https://www.example.org/test/
8 https://www.example.org/test/update-user
...测试文件夹是一个 PHP MVC 平台,因此它使用该文件夹内的“将所有内容导向 index.php”技术。
...因此我想将上述内容翻译为:
1 http://www.example.org/
2 http://www.example.org/
3 https://www.example.org/
4 https://www.example.org/
5 http://www.example.org/test/something.php
6 http://www.example.org/test/
7 https://www.example.org/test/
8 https://www.example.org/test/update-user
这是“无论如何都要使用 www. 子域名”策略。请注意,如果使用该策略,它将保持 https 完好无损。
问题是测试文件夹的 .htaccess 文件忽略了根 .htaccess 文件中的内容,我不知道如何编辑测试文件夹的 .htaccess 文件,以便它能够正确执行 www. 操作。我尝试过(如我在第三个代码示例中演示的那样),但最终出现了 404 错误。
答案1
一个简单的解决方案是为 example.org 网站创建一个单独的根文件夹。
答案2
修复很简单。我在原始问题中提供的示例中几乎已经解决了这个问题。以下代码采用 subdir 测试的 .htaccess 文件,该文件包含一个 PHP MVC 结构,使用“将所有内容指向 index.php 文件”,检测到未使用“www.”前缀,并将“www.”前缀重新添加。我的客户的广告活动特别要求添加“www.”,因为购买的活动只能使用一个域名,而不是两个,而且无需额外费用。
但是,我在测试中失败了,因为我忘记了浏览器缓存和 301 永久重定向。如果之前在实验时连接到过该页面,则可能需要清除浏览器缓存。这是因为在实验过程中使用了 301 重定向,这会告诉浏览器在本地缓存该重定向。这就是我的测试失败的原因。302 临时重定向不会这样做,但实际上在这种情况下 301 永久重定向更好,因为它的浏览器连接时间更快。301 重定向会告诉您的浏览器(在访问此 URL 之前查看您的缓存,以便您知道要去哪里),而 302 重定向会告诉您的浏览器(我会即时决定您应该重定向到哪里)。
解决方法是将子目录信息添加到 .htaccess 文件中。因此,如果我有一个名为“test”的子目录,里面有自己的 .htaccess 文件,那么我需要添加该信息。请注意,/test/ 添加到下面。如果我有这个文件在 /test/test2 中,那么我需要将 /test/test2/ 添加到那里的 .htaccess 文件中。明白了吗?
# SUBDIR .htaccess FILE
Options All +FollowSymLinks -Indexes -Multiviews
# BLOCK ROBOTS AND SPIDERS FROM SCANNING CERTAIN FILES
IndexIgnore .htaccess *~ *.txt *.sql *.xml
# BLOCK SOME COMMON FILE TYPES FROM END USERS
<FilesMatch "\.(sql|xml|txt|htaccess)">
Deny from all
</FilesMatch>
<FilesMatch ".*~$">
Deny from all
</FilesMatch>
RewriteEngine On
# IF HTTPS OFF AND NO WWW, REDIRECT TO HTTP://WWW.*
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^example.org$
RewriteRule ^(.*)$ http://www.example.org/test/$1 [R=301,L]
# IF HTTPS ON AND NO WWW, REDIRECT TO HTTPS://WWW.*
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^example.org$
RewriteRule ^(.*)$ https://www.example.org/test/$1 [R=301,L]
# BESIDES BLOCKED FILES ABOVE, OR FILES WE PHYSICALLY HAVE IN THIS DIRECTORY,
# REDIRECT ALL OTHER OUTPUT TO index.php AND PASS ALL URL PARAMETERS IN FULL.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [QSA]
答案3
正如 Oliver 所暗示的,这里有一个极好的方法是为非 WWW 网站创建一个单独的 VHost,并为其提供全局重定向:
<VirtualHost *:80>
ServerName example.org
RedirectPermanent / http://www.example.org/
</VirtualHost>
如果不这样做,由于您已经修改了下属.htaccess
,只需将其添加到每个下属中:
RewriteOptions inherit
比在多个 es 中维护相同的根级重写代码要干净得多.htaccess
。