标签: mod-rewrite

如何在 Ubuntu 上的 apache 中启用 mod_rewrite?

如何在 Ubuntu 10.04 中使用 Apache 启用 mod_rewrite?

我尝试rewrite.load/etc/apache2/mods-availableto复制,etc/apache2/mods-enabled但没有奏效。

mod-rewrite apache-2.2

13
推荐指数
1
解决办法
3万
查看次数

参数长度大于 255 的重写 URL 不起作用

我正在使用 mod_rewrite 来重写这样的 URL:

http://example.com/1,2,3,4/foo/
Run Code Online (Sandbox Code Playgroud)

通过在 .htaccess 中执行此操作:

RewriteEngine On
RewriteRule ^([\d,]+)/foo/$ /foo.php?id=$1 [L,QSA]
Run Code Online (Sandbox Code Playgroud)

它工作正常,除了当“1,2,3,4”变成长度超过 255 个字符的字符串时,Apache 返回“403 Forbidden”。

foo.php?id=1,2,3,4直接访问没有问题,即使 id 字符串很长,但这对我来说不是一个选择。

我应该调整一些 Apache 或其他设置吗?

更新:我用 RewriteLogLevel 9 打开了 RewriteLog。使用一个短的 id 字符串,我在我的日志文件中得到了几行。但是当 id 字符串大于 255 个字符时,不会记录任何内容(好像 mod_rewrite 甚至没有执行?)。

如果您觉得这个问题有趣/有帮助,请点赞。

mod-rewrite url querystring apache-2.2

13
推荐指数
1
解决办法
1万
查看次数

Apache mod_rewrite 在重定向时对查询字符串进行双重编码

我们在传递查询字符串时遇到了 Apache mod_rewrite 行为的一个奇怪问题(也许是一个错误?)。

为了重现,我们使用默认的 Apache 配置设置了一个干净的 Ubuntu (oneiric) 安装。我们启用了 mod_rewrite,并且在默认站点配置中,我们添加了以下内容:

RewriteEngine on
RewriteRule ^/(.*)$ /r/$1 [R]
Run Code Online (Sandbox Code Playgroud)

为了测试,我们使用 curl:

curl -I 'http://[ubuntu-machine]/a/b%20c?a%20b'
Run Code Online (Sandbox Code Playgroud)

相关输出是:

HTTP/1.1 302 Found
Server: Apache/2.2.20 (Ubuntu)
Location: http://[ubuntu-machine]/r/a/b%20c?a%2520b
Run Code Online (Sandbox Code Playgroud)

如您所见,查询字符串被双重转义,这是错误的。有谁知道我们如何解决这个问题?我们尝试了几件事:

  • 添加 [NE]。这为我们提供了正确的查询字符串,但路径未转义,这会导致新问题。
  • 添加 [NE,B]。这似乎有效,但会导致路径/ab部分之间被转义。
  • 手动取消转义查询字符串。

    RewriteCond %{QUERY_STRING} .*
    RewriteMap unescape int:unescape  
    RewriteRule ^(.*)$          $1?${unescape:%{QUERY_STRING}}
    
    Run Code Online (Sandbox Code Playgroud)

    然而,这意味着我们无法区分查询字符串中的an&和 an 转义&符。

更新:

此错误报告描述了相同的问题。第一条评论链接到一个明显解决问题的提交,但正如 Pieter 在下面所说的,它似乎并没有真正修复。

mod-rewrite escaping querystring apache-2.2

13
推荐指数
1
解决办法
6398
查看次数

mod_rewrite 的 url 的最大长度为 257 个字符?

我的网址方案是 /foo/var1-var2-var3.../bar

我正在使用这些 mod_rewrite 规则:

RewriteBase /foo/
RewriteEngine on

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

RewriteRule ^ index.php [PT,L]
Run Code Online (Sandbox Code Playgroud)

如果字符串 'var1-var2...' 的长度大于 257 个字符,则返回错误 403 Forbidden 和 404。但是,如果 'var1-var2...' 字符串的长度为 257 个字符或更少,并且后跟一个斜杠,则剩余 url 的长度可以是任意长度。如何克服这一限制?

mod-rewrite .htaccess

12
推荐指数
1
解决办法
1万
查看次数

Apache 可以有条件地从自定义 http 标头执行重写吗?

我在(简单的亚马逊)负载平衡器后面有一个 apache 服务器。我想将任何不是 443 的传入流量重定向到 443。我希望它只使用一个 apache 虚拟主机。所以我试图检测 HTTP_X_FORWARDED_PORT 标头是否不是 443。

我检查了RewriteCond 文档,它只适用于有限的一组 HTTP 标头。

基本上我在做什么是这样的:

<VirtualHost *:80>
        ServerName www.example.com

        RewriteEngine On
        RewriteCond %{HTTP_X_FORWARDED_PORT} !=443
        RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

        ....
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

但 RewriteCond 无法识别 HTTP_X_FORWARDED_PORT。

有没有其他方法可以做到这一点(只有一个 VirtualHost)?(某种类型的传入标头检查?)

谢谢,兰斯

mod-rewrite apache-2.2

12
推荐指数
1
解决办法
2万
查看次数

为什么在 .htaccess 中启用重写日志不起作用?

我想启用重写日志记录,以便我可以调试重写规则,但添加 RewriteLog 指令会导致 500 错误。

版本信息:

Ubuntu 14.04

Server version: Apache/2.4.12 (Ubuntu)
Server built:   Feb  4 2015 14:22:06
Run Code Online (Sandbox Code Playgroud)

的内容 .htaccess

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteLog /var/log/apache2/rewrite.log
RewriteLogLevel 5

RewriteBase /

RewriteRule ^/wordpress/wp-content/(.*)$ /wp-content/$1 [L]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
Run Code Online (Sandbox Code Playgroud)

在错误日志中我看到:

/var/www/path.to/wordpress/.htaccess: Invalid command 'RewriteLog', perhaps misspelled or defined by a module not included in the server configuration
Run Code Online (Sandbox Code Playgroud)

mod-rewrite apache-2.4

12
推荐指数
1
解决办法
3万
查看次数

如何将整个网站重定向到单个页面?

我正在关闭一个站点,并在站点的根级别用一个“无人主页”页面替换了旧站点。现在我需要设置一些重定向,以便对站点任何部分的任何请求,无论多么复杂,都以根页面结束。

我已经尝试了(我认为)应该工作的内容:创建一个.htaccess包含以下内容的文件:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://www.example.com/ [L,R=301,NE]
Run Code Online (Sandbox Code Playgroud)

但它大多失败:请求http://www.example.com仍然通过,但https://www.example.com/doesnotexist.html抛出 404。(如果没有重定向,这是正确的,因为该页面不存在于站点上,但这就是重定向的重点:我希望将此请求发送到https://www.example.com。)

阿格。这个问题的答案可能对除了我之外的每个人都是显而易见的。任何人都可以帮忙吗?

PS:我处于共享主机的情况,所以我必须用一个.htaccess文件来做到这一点,而不是破解一个完整的 Apache 配置文件。

mod-rewrite .htaccess redirection apache-2.2

12
推荐指数
1
解决办法
3457
查看次数

Apache mod_proxy 与 mod_rewrite

使用 mod_proxy 和 mod_rewrite 有什么区别?

我需要通过 tomcat 发送某些 url 模式,它在同一台主机上运行,​​但在端口 8080 下。我知道这是 mod_proxy 的东西,但我想知道为什么我不能只使用 mod_rewrite,或者有什么区别是?

可能必须使用反向代理,并且在管道中时它会得到处理?

谢谢。

mod-rewrite mod-proxy apache-2.2

11
推荐指数
2
解决办法
9096
查看次数

Apache 重写多个条件

我有一个从旧域名(例如 olddomain.com)迁移到新域名(例如 newdomain.com)的网站。

出于 SEO 的原因,我需要将所有网站流量重写为主要的新域名(例如 www.newdomain.com)。不幸的是,我不知道如何添加多个 OR 类型的重写条件。似乎在所有条件下,下面的示例代码,我得到了一个 AND 条件。

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName newdomain.com
        ServerAlias www.newdomain.com
        ServerAlias olddomain.com
        ServerAlias www.olddomain.com
        DocumentRoot /var/www/newdomain.com/www/
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        RewriteEngine on
        RewriteCond %{HTTP_HOST} ^olddomain.com [NC]
        RewriteCond %{HTTP_HOST} ^www.olddomain.com [NC]
        RewriteCond %{HTTP_HOST} ^newdomain.com [NC]
        RewriteRule ^/(.*)$ http://www.newdomain.com/$1 [R=301,NC]

        CustomLog /var/log/apache2/access.log combined
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

有人可以给我一点帮助吗?任何帮助将不胜感激。

mod-rewrite apache-2.2

11
推荐指数
1
解决办法
6万
查看次数

为什么 https 不起作用?

我正在尝试将我的网站的根目录重定向到 https。尽管重写发生了,但 https 不会产生任何结果。浏览器说。connecting to thinkingmonkey.me...和停滞。

  • 听 80听 443存在于 conf 文件中。
  • 我已经重新启动了 httpd。
  • 我正在使用正确的证书文件和私钥文件。
  • httpd 日志中没有错误,SSL 日志(我有一个单独的SSl 日志)。
  • 即使我尝试直接访问https://thinkingmonkey.me,实际上也没有任何内容记录到 SSL 访问日志中。

Anetstat -pant | grep httpd有这个:

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name  
tcp        0      0 :::443                      :::*                        LISTEN      1334/httpd          
tcp        0      0 :::80                       :::*                        LISTEN      1334/httpd   
Run Code Online (Sandbox Code Playgroud)

.htaccess:

RewriteEngine on
RewriteBase /

RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ https://thinkingmonkey.me [L,R=302]
Run Code Online (Sandbox Code Playgroud)

重写日志数据: …

mod-rewrite ssl https httpd apache-2.2

11
推荐指数
1
解决办法
5万
查看次数