两个.htaccess文件之间的mod_rewrite交互

时间:2016-11-09 02:40:16

标签: php apache .htaccess mod-rewrite

位于网络根目录.htaccess

中的

/文件

RewriteEngine on

RewriteCond %{HTTP_HOST} ^product.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.product.com$ [OR]
RewriteCond %{HTTP_HOST} ^product.com.au$ [OR]
RewriteCond %{HTTP_HOST} ^www.product.com.au$
RewriteRule ^(.*)$ https://www.company.com/product/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^company.com.au$ [OR]
RewriteCond %{HTTP_HOST} ^www.company.com.au$ [OR]
RewriteCond %{HTTP_HOST} ^companyalternate.com.au$ [OR]
RewriteCond %{HTTP_HOST} ^www.companyalternate.com.au$ [OR]
RewriteCond %{HTTP_HOST} ^company.com$
RewriteRule ^(.*)$ https://www.company.com/$1 [R=301,L]

RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

.htaccess文件位于/product/blog/

RewriteEngine On
RewriteBase /product/blog/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php?article=$1

据我所知,URL重写正在按预期工作,直到我输入如下内容:

company.com.au/product/blog/test-article

在这种情况下,生成的url与输入的完全一致,但是从/product/blog/index.php脚本中检索预期的内容。所以正在处理/product/blog/.htaccess,但似乎/.htaccess不是?

我希望将上述网址重定向到:

https://www.company.com/product/blog/index.php?article=test-article

并显示为:

https://www.company.com/product/blog/test-article

我哪里错了?

2 个答案:

答案 0 :(得分:1)

正如在评论/回答中已经提到的那样,Apache .htaccess是每个目录的指令。 Apache仅使用最接近/最近的.htaccess,因此在您的情况下,仅使用/product/blog/.htaccess并忽略/.htaccess

您可以在/product/blog/.htaccess

的顶部使用此指令
RewriteOptions InheritBefore

这将使父范围中的规则子范围中指定的规则之前应用

Here is Apache documentation

答案 1 :(得分:0)

这是来自官方文档,

  

.htaccess文件中的配置指令将应用于找到.htaccess文件的目录及其所有子目录。但是,重要的是还要记住,目录中可能存在.htaccess文件。指令按照找到的顺序应用。因此,特定目录中的.htaccess文件可能会覆盖在目录树中较高位置的.htaccess文件中找到的指令。反过来,这些可能已被覆盖的指令更高,或者在主服务器配置文件本身中。

http://httpd.apache.org/docs/trunk/howto/htaccess.html#how

我猜你的问题是为什么它没有被301重定向。

如果没有太多考虑,我会说它必须与已经提供的内容有关。如果已经提供了内容,则可能无法设置301标头。