如何在 Ubuntu 10.04 中使用 Apache 启用 mod_rewrite?
我尝试rewrite.load从/etc/apache2/mods-availableto复制,etc/apache2/mods-enabled但没有奏效。
我正在使用 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 甚至没有执行?)。
如果您觉得这个问题有趣/有帮助,请点赞。
我们在传递查询字符串时遇到了 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)
如您所见,查询字符串被双重转义,这是错误的。有谁知道我们如何解决这个问题?我们尝试了几件事:
/的a和b部分之间被转义。手动取消转义查询字符串。
RewriteCond %{QUERY_STRING} .*
RewriteMap unescape int:unescape
RewriteRule ^(.*)$ $1?${unescape:%{QUERY_STRING}}
Run Code Online (Sandbox Code Playgroud)
然而,这意味着我们无法区分查询字符串中的an&和 an 转义&符。
更新:
此错误报告描述了相同的问题。第一条评论链接到一个明显解决问题的提交,但正如 Pieter 在下面所说的,它似乎并没有真正修复。
我的网址方案是 /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 的长度可以是任意长度。如何克服这一限制?
我在(简单的亚马逊)负载平衡器后面有一个 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)?(某种类型的传入标头检查?)
谢谢,兰斯
我想启用重写日志记录,以便我可以调试重写规则,但添加 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) 我正在关闭一个站点,并在站点的根级别用一个“无人主页”页面替换了旧站点。现在我需要设置一些重定向,以便对站点任何部分的任何请求,无论多么复杂,都以根页面结束。
我已经尝试了(我认为)应该工作的内容:创建一个.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_proxy 和 mod_rewrite 有什么区别?
我需要通过 tomcat 发送某些 url 模式,它在同一台主机上运行,但在端口 8080 下。我知道这是 mod_proxy 的东西,但我想知道为什么我不能只使用 mod_rewrite,或者有什么区别是?
可能必须使用反向代理,并且在管道中时它会得到处理?
谢谢。
我有一个从旧域名(例如 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)
有人可以给我一点帮助吗?任何帮助将不胜感激。
我正在尝试将我的网站的根目录重定向到 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 ×10
apache-2.2 ×8
.htaccess ×2
querystring ×2
apache-2.4 ×1
escaping ×1
httpd ×1
https ×1
mod-proxy ×1
redirection ×1
ssl ×1
url ×1