通过.htaccess将除一个页面外的所有页面重定向到主页

时间:2016-04-28 作者:bluantinoo

我刚刚把一个旧网站变成了一页的Wordpress。

旧网站有几个URL,现在只有一个:主页。加上另一个带有隐私政策的页面。

因此,我想将所有URL重定向到主页,除了带有slug“privacy”的URL。

这就是我正在尝试的,但没有成功:

#custom redirects
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/privacy-policy/
RewriteRule (.*) http://www.mywebsite.com/$1 [R=301,L]
</IfModule>

# BEGIN WordPress (standard wp htaccess rules)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
我得到了太多的重定向:所有URL都无限地重定向到自己,为什么?

如果可能的话,使用重定向规则而不是重写会更好吗?

UPDATE

以下评论建议我尝试了以下自定义重定向(在WP标准规则之前):

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/privacy-policy$
RewriteRule (.*) http://mywebsite.com/ [R=301,L]
</IfModule>
但仍然不起作用

2 个回复
SO网友:bosco

问题

我得到了太多的重定向:所有URL都无限地重定向到自己,为什么?

Apache重写规则是自上而下处理的,因此您的自定义重写规则总是先处理。这个R 重定向标志指示Apache告诉浏览器向更改的URL发出新请求,而不是在当前地址提供重写的目标,并且L “last”标志告诉Apache忽略所有正在进行的重写规则,所以无论何时RewriteRule 应用时,将发出新请求,并从顶部再次处理您的规则。

你的RewriteCond 指示Apache处理该过程RewriteRule 每当请求URI路径不以开头时/privacy-policy - 因此,实际上每个请求都会在您的.htaccess 甚至可以评估。

正如评论中提到的@MarkKaplen$1 是用第一个“捕获组”(模式中的第一组括号)中包含的匹配URI部分替换的反向引用。自从.* 字面上匹配任意数量的任意字符RewriteRule $1 替换为整个URI路径。

本质上,您的重写规则:

RewriteCond %{REQUEST_URI} !^/privacy-policy/
RewriteRule (.*) http://www.mywebsite.com/$1 [R=301,L]
如果URI不是以开头,则计算为/privacy-policy/, 让web浏览器向发送新请求http://www.mywebsite.com/(original URI path)“。

因此,为了便于说明,假设您导航到http://www.mywebsite.com/blog/2015; 下面是每个请求的情况:

  1. /blog/2015 不以开头/privacy-policy/, 告诉浏览器转到http://www.mywebsite.com/blog/2015.
  2. /blog/2015 不以开头/privacy-policy/, 告诉浏览器转到http://www.mywebsite.com/blog/2015.
  3. /blog/2015 不以开头/privacy-policy/, 告诉浏览器转到http://www.mywebsite.com/blog/2015.
  4. […]
卸下$1 从返回引用RewriteRule 不足,因为URI路径为/ (或只是空的一个)仍然不符合以开头的条件/privacy-policy/, 导致以下行为:

  1. /blog/2015 不以开头/privacy-policy/, 告诉浏览器转到http://www.mywebsite.com/.
  2. / 不以开头/privacy-policy/, 告诉浏览器转到http://www.mywebsite.com/.
  3. / 不以开头/privacy-policy/, 告诉浏览器转到http://www.mywebsite.com/.
  4. […]
您可以通过查看Apache安装的日志文件来验证此行为。

如果您不打算使用WordPress的预期地址路由,那么没有理由保留默认重写规则并在其上堆叠更多规则。根据您的需要定制,而不是增加复杂性:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^(/|index\\.php)$ /index.php? [L]
RewriteRule ^/?privacy-policy/?$ /index.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /? [L,R=301]
</IfModule>
总之,

  1. RewriteRule ^(/|index\\.php)$ /index.php? [L]

    如果/index.php 已明确请求,请送达index.php, 但是删除querystring(以防止通过查询var操作更改页面)并停止处理重写。

  2. RewriteRule ^/?privacy-policy/?$ /index.php [L]

    如果privacy-policy (带或不带前导斜杠和尾随斜杠)已明确请求index.php 并停止处理重写。

  3. RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /? [L,R=301]
    
    如果请求的文件名不是文件也不是目录,请在任意位置匹配一个字符(以便无论URI如何都应用该规则),并告诉浏览器向/ 丢弃它的querystring。停止处理重写。

值得注意的是,您的预期结果可能会产生许多意外行为,例如,您可能无法访问管理仪表板。附件也可能损坏。但以上内容至少应该为更多地了解重写指令提供一个良好的起点。

SO网友:Florian

Please try

<IfModule mod_rewrite.c>
RewriteRule ^/privacy-policy/? privacy-policy [L,NC]

RewriteCond %{HTTP_HOST} ^(www\\.)?oldsite\\.com  [NC]
RewriteRule ^ http://mywebsite.com%{REQUEST_URI} [NE,R=301,L]
</IfModule>

相关推荐

Redirect Css files to https

在哪里可以找到负责调用Css文件的文件,并测试它们的链接是http还是https?我想测试请求是否为https,如果是,那么很好,如果不是,请将其更改为https在函数中。php我找到了负责调用主题Css的函数,下面是它的代码:if (!function_exists(\'jobcareer_front_scripts\')) { function jobcareer_front_scripts() { global $jobcareer_options;