![移动 URL 重写规则](https://linux22.com/image/702008/%E7%A7%BB%E5%8A%A8%20URL%20%E9%87%8D%E5%86%99%E8%A7%84%E5%88%99.png)
我必须将移动用户重定向到新的 URL ( /amp/...
),因此我将这段代码添加到我的 Apache 站点配置中:
RewriteCond %{HTTP_REFERER} !^http://test.domain.com [NC]
RewriteCond %{REQUEST_URI} !^/amp/.*$
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC]
RewriteRule ^(.*)$ /amp/$1 [L,R=302]`
问题是,只有在请求主页 ( test.domain.com
) 时才会重定向,而请求其他任何 URL(例如test.domain.com/category/web
)时则不会重定向。知道我做错了什么吗?
这是一个 Wordpress 站点,完整的重写模块是:
<Directory /var/www/project>
DirectoryIndex index.php
Options None FollowSymLinks
AllowOverride none
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^uploads/(.+) http://myCDN.com/uploads/$1 [R,L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
RewriteCond %{HTTP_REFERER} !^http://test.domain.com [NC]
RewriteCond %{REQUEST_URI} !^/amp/.*$
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC]
RewriteRule ^(.*)$ /amp/$1 [L,R=302]
</IfModule>
</Directory>
答案1
您的重定向需要删除前前端控制器(内部重写)。前端控制器捕获除文档根目录(主页)之外的所有请求。因此,您的重定向仅针对主页进行处理,而对于所有其他请求,则被忽略。
换句话说:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_REFERER} !^http://test.domain.com [NC]
RewriteCond %{REQUEST_URI} !^/amp/.*$
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC]
RewriteRule ^(.*)$ /amp/$1 [L,R=302]
RewriteRule ^uploads/(.+) http://myCDN.com/uploads/$1 [R,L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
一般来说,外部重定向应该始终在内部重写之前进行。
您提到这是在您的“Apache 站点配置”中。我假设这些指令位于<Directory>
容器中之内你的“网站配置”(即在目录上下文)。(这些指令在服务器配置或者虚拟主机上下文,即直接在您的“站点配置”中。)