【问题标题】:mod_rewrite [PT] flag returns bad requestmod_rewrite [PT] 标志返回错误请求
【发布时间】:2012-01-10 11:31:11
【问题描述】:

最初,编写此代码是为了创建 "pretty" 网址。

使用下面的代码时,mod_rewrite 可以正常工作。

<Directory /var/www/vhosts/myurl.com/httpdocs>
    Options Indexes FollowSymLinks
    php_admin_flag engine on
    php_admin_value open_basedir none
    AllowOverride all
    Order allow,deny
    Allow from all
</Directory>

RewriteEngine on
RewriteCond %{HTTPS} !=off
RewriteCond %{LA-U:REQUEST_FILENAME} !-f
RewriteCond %{LA-U:REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/index\.php$
RewriteCond $1 ^(register|account|logout|profile|edit_profile).*$
RewriteRule ^/(.*)$ https://myurl.com/?get=$1 

它接受任何匹配的 url,例如 https://myurl.com/register 并将其重写为 https://myurl.com/?get=register。在浏览器中找到并显示相应的页面。

但是,我希望将原始 url 传递给浏览器。为此,我将 [PT] Flag 添加到我的 RewriteRule 中,如下所示:

RewriteRule ^/(.*)$ https://myurl.com/?get=$1 [PT]

这让 https://myurl.com/register(与上述相同的 url)进入浏览器,但不再显示页面。相反,它返回以下错误:

Bad Request
Your browser sent a request that this server could not understand.
Client sent malformed Host header

相关信息:

操作系统: Linux
服务器: Apache
控制: Plesk
目录: /var/www/vhosts/myurl.com/conf
文件: vhost_ssl.conf

我搜索了多个论坛和文章均无济于事。

第 1 条: Making prettier URLs with mod_rewrite(包括使用 [PT] 标志)

有没有人知道这里发生了什么以及如何解决它?如何让 “pretty” 网址显示?

【问题讨论】:

  • 根据我的阅读,您应该使用R 标志,而不是PT。 R 标志使浏览器重定向到另一个 url。 PT 标志很少有用,也不能做你想做的事。
  • 您可以尝试将PT 更改为P(代理)
  • 感谢您的回复。尝试了PR 标志。两者都没有改善情况。让我澄清一下问题。就重定向而言,该代码工作正常。但是,浏览器显示的是 ugly 网址:https://myurl.com/?get=$1。我需要它来显示原始 pretty url https://myurl.com/register。我的研究表明PT Flag 可以解决这个问题。它没有。相反,它破坏了代码。我会尝试添加一个链接。
  • 您是否尝试将规则从RewriteRule ^/(.*)$ https://myurl.com/?get=$1 更改为RewriteRule ^/(.*)$ /?get=$1 [L]
  • 你好乔恩。是的,也试过了。昨晚没睡好,但我终于找到了解决办法。感谢您的回复。请参阅下面的答案。

标签: .htaccess mod-rewrite friendly-url bad-request


【解决方案1】:

所以在折腾了两天之后,我终于解开了这个谜题。

首先我通过将 RewriteRule 更改为:

RewriteRule ^/(.*)$ https://myurl.com/?get=$1 [P]

RewriteRule ^/(.*)$ https://myurl.com/index.php?get=$1

没有任何标志。

每当触发重写时,这都会产生无限循环。但我注意到循环在没有重定向 url 的情况下发生(维护 'pretty url')。进步!

我决定简化代码。我从 RewriteCond 中删除了 'LA-U:',如下所示:

RewriteCond %{LA-U:REQUEST_FILENAME} !-f
RewriteCond %{LA-U:REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

成功了!感谢那些发表评论的人。希望这对将来的人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-12
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多