当 Redirect 和 RewriteRule 一起使用时,.htaccess 重定向循环

gtr*_*971 4 .htaccess mod-rewrite redirect

我正在 HTACCESS 文件中尝试以下操作:

我想 301 重定向这个 --> http://www.domain.com/somepage.php?page=foo

对此 --> http://www.domain.com/my-pretty-url/

当我更改网站上的内部链接以阅读我想要的方式并且我不使用 R=301 标志时,这很好用:

RewriteRule ^my-pretty-url/$ /index\.php?page=foo [L]
Run Code Online (Sandbox Code Playgroud)

但是...这里的问题是我还想 301 将任何外部请求重定向到服务器,当我处理它时,它会将我置于重定向循环中。

RewriteCond %{REQUEST_URI} /index.php$
RewriteCond %{QUERY_STRING} ^page=foo$
RewriteRule ^.*$ http://www.domain.com/my-pretty-url/? [R=301,L]

RewriteRule ^my-pretty-url/$ /index\.php?page=foo [L]
Run Code Online (Sandbox Code Playgroud)

RewriteCond 规则本身不工作,只有底部的单个 RewriteRule 自己工作以进行内部重写,但它不处理外部请求。

显然,如果我同时拥有两者,则会创建一个循环。我该如何解决这个问题??

谢谢!

Ulr*_*lha 5

尝试以下操作以防止循环

#prevent internal redirects, and prevent loop
RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteCond %{REQUEST_URI} /index.php$
RewriteCond %{QUERY_STRING} ^page=foo$
RewriteRule ^.*$ http://www.domain.com/my-pretty-url/? [R=301,L]

RewriteRule ^my-pretty-url/$ /index\.php?page=foo [L]
Run Code Online (Sandbox Code Playgroud)