.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]
根据我的尝试结果观察:
规则
RewriteRule ^welcomepage/$ code/login.php? [QSA,L]
不重定向,所以我用了^.*welcomepage.*$
.
规则
RewriteRule ^(?:dir1/)?(?:dir2/)?(?:login.php)$ /welcomepage/? [R=301,NC,L]
RewriteRule ^.*welcomepage.*$ code/login.php? [QSA,L]
重定向到 www.domain.com/welcomepage/
但内部重定向失败。
规则
RewriteRule ^(?:dir1/)?(?:dir2/)?(?:login.php)$ /welcomepage/? [R=301,NC]
RewriteRule ^.*welcomepage.*$ code/login.php? [QSA,L]
重定向到第二个 link 但不是第一个。
- 我在站点的配置中添加了一个 RewriteLog 文件设置,但它似乎不起作用。
- 在某些时候重定向工作正常,但文件上传等失败(
POST
操作)。
问题:
- 有谁知道如何在不丢失文件上传等功能的情况下实现隐藏重定向。
- 如果没有,有谁知道怎么做
正确设置重定向日志,以便我可以调试重定向
更高效?
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 的隐藏重定向。
在这里我必须有点创意。在文件上传的表单中,我将重定向更改为指向 fake、beatified 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
。
我的目标是采用 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]
根据我的尝试结果观察:
规则
RewriteRule ^welcomepage/$ code/login.php? [QSA,L]
不重定向,所以我用了
^.*welcomepage.*$
.规则
RewriteRule ^(?:dir1/)?(?:dir2/)?(?:login.php)$ /welcomepage/? [R=301,NC,L] RewriteRule ^.*welcomepage.*$ code/login.php? [QSA,L]
重定向到
www.domain.com/welcomepage/
但内部重定向失败。规则
RewriteRule ^(?:dir1/)?(?:dir2/)?(?:login.php)$ /welcomepage/? [R=301,NC] RewriteRule ^.*welcomepage.*$ code/login.php? [QSA,L]
重定向到第二个 link 但不是第一个。
- 我在站点的配置中添加了一个 RewriteLog 文件设置,但它似乎不起作用。
- 在某些时候重定向工作正常,但文件上传等失败(
POST
操作)。
问题:
- 有谁知道如何在不丢失文件上传等功能的情况下实现隐藏重定向。
- 如果没有,有谁知道怎么做 正确设置重定向日志,以便我可以调试重定向 更高效?
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 的隐藏重定向。
在这里我必须有点创意。在文件上传的表单中,我将重定向更改为指向 fake、beatified 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
。