.htaccess redirect beautify URL/ 隐藏结构

.htaccess redirection beatify URL/ Hide structure

我的目标是采用 URL 格式

www.mydomain.com(/dir1)?(/dir2)?/(index.php|login.php)((:?\?code=)[a-Z0-9]+)?

强制浏览器url变为:

www.mydomain.com/(home|welcomepage)/code/%1/

一个更简单的例子是:

 www.mydomain.com/dir1/dir2/index.php?code=khkdh239

更改为:

 www.mydomain.com/home/code/khkdh239/

并在内部重定向到

 www.mydomain.com/dir1/dir2/index.php?code=khkdh239

这是我的许多尝试之一;

#RewriteCond %{QUERY_STRING} !^$  # I was experimenting with simple urls, no ?code=....
#RewriteRule .? - [S=2]
RewriteRule ^(?:dir1/)?(?:dir2/)?(?:login.php)$ /welcomepage/? [R=301,NC]
RewriteRule ^.*welcomepage.*$ code/login.php? [QSA,L]

根据我的尝试结果观察:

  1. 规则

    RewriteRule ^welcomepage/$ code/login.php? [QSA,L]
    

    不重定向,所以我用了^.*welcomepage.*$.

  2. 规则

    RewriteRule ^(?:dir1/)?(?:dir2/)?(?:login.php)$ /welcomepage/? [R=301,NC,L]
    RewriteRule ^.*welcomepage.*$ code/login.php? [QSA,L]
    

    重定向到 www.domain.com/welcomepage/ 但内部重定向失败。

  3. 规则

    RewriteRule ^(?:dir1/)?(?:dir2/)?(?:login.php)$ /welcomepage/? [R=301,NC]
    RewriteRule ^.*welcomepage.*$ code/login.php? [QSA,L]
    

    重定向到第二个 link 但不是第一个。

  4. 我在站点的配置中添加了一个 RewriteLog 文件设置,但它似乎不起作用。
  5. 在某些时候重定向工作正常,但文件上传等失败(POST 操作)。

问题:

  1. 有谁知道如何在不丢失文件上传等功能的情况下实现隐藏重定向。
  2. 如果没有,有谁知道怎么做 正确设置重定向日志,以便我可以调试重定向 更高效?

PS:我知道堆栈溢出有多个问题,我一直在研究这些问题以及 .htaccess 重定向手册,但似乎总是存在一些问题。

提前谢谢大家。

要将您的 URL 重定向到漂亮的,您需要检查 %{THE_REQUEST} 变量:

RewriteCond %{THE_REQUEST} GET\ (?:/dir1)?(?:/dir2)?/index\.php\?code=([^&]+) [NC]
RewriteRule ^index\.php$ /home/code/%1/ [R=301,L]

接下来,您希望友好 URL 在内部寻址其他一些脚本:

RewriteRule ^home/code/([^/]+)/?$ /dir1/dir2/index.php?code= [NC,L]

最终未完善的解决方案是 anubhava, hjpotter92 和我的组合。

我将提供 .httaccess 代码,以防有人遇到类似问题。

重要:可以找到所有重定向标志 here([NC,R,P,L] 等)。

为什么大部分重定向都不起作用

因为我的 .htacces 文件位于 /{ROOT_DIRECTORY_OF_SITE}/dir1/ 而不是 /{ROOT_DIRECTORY_OF_SITE}/

如何实现 GET url 的隐藏重定向

为了做到这一点,我遵循了 hjpotter92 的建议,并检查了 THE_REQUEST 的所有 GET 请求是否遵循特定的正则表达式。在那些情况下,真实地址被转发到一个假地址。我用的是R=301,这是永久重定向,只有在我确定它是正确的时候才使用。调试时使用 R=302 和隐私浏览。

# Redirect dir1/dir2/login.php?code=password  to fake address mydomain.com/signup/?code=password
RewriteCond %{THE_REQUEST} GET\ /?(?:dir1/)?(?:dir2/)?login\.php\?code=([^&]+) [NC]
RewriteRule ^.*$ /signup/%1/ [R=301,L]

#Redirect fake address mydomain.com/signup/?code=pasword internaly to real address
RewriteRule ^signup/([^/]+)/$ /dir1/dir2/login.php?code= [NC,L]

如何在不丢失文件上传等功能的情况下实现 POST url 的隐藏重定向。

在这里我必须有点创意。在文件上传的表单中,我将重定向更改为指向 fakebeatified url.

例如,将 post 请求发送到 mydomain.com/signup/send-mail/#login 我使用了:

<form role="form" method="POST" action="/signup/send-mail/#login" id="login">

然后在 .htaccess 文件中,我将伪造的 url 请求重定向到真实请求。

RewriteRule ^signup/email-sent/ /dir1/dir2/login.php#login [NC,P]

[P] 标志等同于 [L] 但它还允许 POST 数据重定向,因为它作为代理工作。 [L] 标志只是告诉系统不要在 .htaccess 文件中继续向下,因为这将是最后一次重定向(简单来说,有关详细信息,请参阅 documentation)。

.htaccess

Options -Indexes 
DirectoryIndex ./dir1/dir2/index.php

RewriteEngine on

# Redirect dir1/dir2/login.php?code=password  to fake address mydomain.com/signup/?code=password
RewriteCond %{THE_REQUEST} GET\ /?(?:dir1/)?(?:dir2/)?login\.php\?code=([^&]+) [NC]
RewriteRule ^.*$ /signup/%1/ [R=301,L]

#Redirect fake address mydomain.com/signup/?code=pasword internaly to real address
RewriteRule ^signup/([^/]+)/$ /dir1/dir2/login.php?code= [NC,L]


# Redirect dir1/dir2/login.php to fake address mydomain.com/signup/
RewriteCond %{THE_REQUEST} GET\ /?(?:dir1/)?(?:code/)?login\.php [NC]
RewriteRule ^.*$ /signup/ [R=302,L]

#Redirect fake address mydomain.com/signup/ internaly to real address
RewriteRule ^signup/$ /dir1/dir2/login.php [NC,L]


# Redirect dir1/dir2/index.php?code=password to fake address mydomain.com/home/?code=password
RewriteCond %{THE_REQUEST} GET\ /?(?:dir1/)?(?:code/)?index\.php\?code=([^&]+) [NC]
RewriteRule ^.*$ /home/%1/ [R=302,L]

# Redirect the fake address mydomain.com/home/?code=password to a real one, internaly
RewriteRule ^home/([^/]+)/$ /dir1/dir2/index.php?code= [NC,L]

# Redirect dir1/dir2/index.php to fake address mydomain.com/home/
RewriteCond %{THE_REQUEST} GET\ /?(?:dir1/)?(?:code/)?index\.php [NC]
RewriteRule ^.*$ /home/ [R=302,L]

# Redirect the fake address mydomain.com/home/ to a real one, internaly
RewriteRule ^home/$ /dir1/dir2/index.php [NC,L]


# Redirect the fake address mydomain.com/signup/email-sent/ to a realone
RewriteRule ^signup/email-sent/ /dir1/dir2/login.php#login [NC,P]

# Redirect the fake address mydomain.com/home/file-uploaded/ to a realone
RewriteRule ^home/file-uploaded/ /dir1/dir2/index.php#page-demo-upload [NC,P]

非常感谢所有回答我 post 并帮助我达到此版本的 .htaccess