我在我的开发机器上使用 mod_rewrite 设置 Apache 时遇到问题。Mod_rewrite 处于活动状态,并且适用于某些规则。某些规则无法按预期工作,例如:
RewriteRule ^static/([^/]+)/([^/]+) /static.php?sISOCode=$1&sPage=$2
Run Code Online (Sandbox Code Playgroud)
在 static.php 中,我这样做(用于调试):
<?php
print_r($_GET); print_r($_POST); print_r($_SERVER); die();
Run Code Online (Sandbox Code Playgroud)
其中打印(从 $_SERVER 数组中删除了一些项目):
Array
(
)
Array
(
)
Array
(
[SERVER_SIGNATURE] => <address>Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.1 with Suhosin-Patch Server at alpha.prove.no Port 80</address>
[SERVER_SOFTWARE] => Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.1 with Suhosin-Patch
[SERVER_ADDR] => 127.0.0.1
[SERVER_PORT] => 80
[REMOTE_ADDR] => 127.0.0.1
[DOCUMENT_ROOT] => /home/veg/workspace/project
[SERVER_ADMIN] => webmaster@localhost
[SCRIPT_FILENAME] => /home/veg/workspace/project/static.php
[REMOTE_PORT] => 38954
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => GET
[QUERY_STRING] =>
[REQUEST_URI] …Run Code Online (Sandbox Code Playgroud) 我使用以下代码将所有 www 请求定向到非 www URL:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)
这在我网站根目录的 .htaccess 文件中非常有效。
例如,
www.example.com -> example.com/www.example.com/
-> example.com/www.example.com/other_page
-> example.com/other_page
但是,如果我将相同的代码移动到我的 VirtualHost 配置中,重写的 URL 将包含一个双斜杠。
www.example.com -> example.com//
www.example.com/ -> example.com//
www.example.com/other_page -> example.com//other_page
我通过从重写规则中删除斜杠来修复它:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^(.*)$ http://example.com$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)
但我无法理解这样做的原因。有谁知道为什么?
网址采用这些形式的 MVC 系统如何通过单个 index.php 文件强制所有请求?
http://www.example.com/foo/bar/baz
http://www.example.com/goo/car/caz/SEO-friendly-name-of-the-object
http://www.example.com/hey/you
Run Code Online (Sandbox Code Playgroud)
编辑:当我尝试下面的重写规则时,出现此错误:
[error] [client 127.0.0.1] Invalid URI in request GET / HTTP/1.1
[error] [client 127.0.0.1] Invalid URI in request GET /abc HTTP/1.1
Run Code Online (Sandbox Code Playgroud)
编辑:哦,这是/index.php 的完整内容。当我删除重写规则时,它会输出 '/' 或 '/index.php' 或者我得到 404 其他任何东西。
<?php
echo htmlspecialchars($_SERVER['REQUEST_URI']);
?>
Run Code Online (Sandbox Code Playgroud)
已解决:我在重写规则中的 index.php 前面添加了一个 / ,然后它起作用了:
再次解决:结果 / 只需要,因为我运行的是 2.2.4。当我升级到 2.2.11 时,不再需要 /。
我有一个 .htaccess 看起来像这样:
RewriteEngine on
RewriteLog "/Applications/MAMP/logs/rewrite_engine_log"
RewriteCond %{REQUEST_URI} !/(index.php|css|images|js)/.*$
RewriteRule (.*) /mysite/index.php/$1
Run Code Online (Sandbox Code Playgroud)
当我添加该 RewriteLog 指令时,我收到内部服务器错误。
在 Apache 日志文件中,我得到以下信息:
/Applications/MAMP/htdocs/mysite/.htaccess: RewriteLog not allowed here
Run Code Online (Sandbox Code Playgroud)
我没有手动创建该 rewrite_engine_log 文件,但该路径 /Applications/MAMP/logs/ 存在于我的 mac 上。接下来我可以尝试什么来获取 RewriteEngine 日志文件?
我想 301 将所有 example.org 重定向到 www.example.org。下面的例子就是这样做的,但是它有很多噪音,因此很难维护并且容易出错:
<VirtualHost 192.0.2.123:80>
ServerName example.org
RedirectPermanent / http://www.example.org
</VirtualHost>
<VirtualHost 192.0.2.123:80>
ServerName www.example.org
DocumentRoot /usr/local/www/example
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
您是否碰巧知道上面的整个内容是否有一些更短的版本?
像这样的伪配置:
<VirtualHost 192.0.2.123:80>
ServerName www.example.org
ServerAlias example.org
# Redirect-Every-ServerAlias-To-ServerName
DocumentRoot /usr/local/www/example
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
这样我就只需要提供应该重定向到的每个子域ServerAlias?
我正在尝试重定向没有 www 的 url。到 www.version(example.com 到 www.example.com)。我用通常的
RewriteCond %{HTTP_HOST} ^example\.com [nc]
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)
这适用于我所有的其他项目。但是,在这个特定站点上,它以重定向循环结束。这是奇怪的部分:我试图卷曲非 www 版本以查看它使用
curl --get http://example.com --dump-header domain.header > domain.html. 头文件如下所示:
HTTP/1.1 301 Moved Permanently
Date: Mon, 06 Jun 2011 14:45:16 GMT
Server: Apache/2.2.16 (Debian)
Location: http://example.com/
Vary: Accept-Encoding
Content-Length: 310
Content-Type: text/html; charset=iso-8859-1
Run Code Online (Sandbox Code Playgroud)
但是,生成的 HTML 文件是这样的:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.example.com/">here</a>.</p>
<hr>
<address>Apache/2.2.16 (Debian) Server at example.com Port 80</address> …Run Code Online (Sandbox Code Playgroud) 宗师
我有一个简单的 .htaccess 文件,我只将非 www 重定向到我的 web 应用程序的 www。现在我想做的是
我当前的 .htaccess 看起来像这样
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\.mydomain\.tld [NC]
RewriteRule ^(.*)$ http://www.mydomain.tld/$1 [R=301.L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ app/webroot/$1 [QSA,L]
</IfModule>
Run Code Online (Sandbox Code Playgroud)
我该怎么办?我可以在我的 .htaccess 文件中完成这一切还是我也需要与 GoDaddy 搞混?如果有意义的话,我宁愿不在应用程序中执行此操作。
我正在运行 Ubuntu 10.04 + Apache 2.2.14-5
谢谢
我正在尝试在 trace3 日志级别启用 mod_rewrite 详细日志记录,如 中所述man。
我已经把这一行放在我的conf:
LogLevel alert rewrite:trace3
Run Code Online (Sandbox Code Playgroud)
但是我收到此错误:
/etc/apache2/sites-enabled/"my_site" 的第 6 行的语法错误:LogLevel 采用一个参数,错误日志记录中的详细级别
我的 Apache 版本是:Apache/2.2.17 (Ubuntu)
这是我的 conf 文件的摘录:
<VirtualHost 10.10.10.14:80>
ServerName my_site <br>
DocumentRoot "/data/website/php./web" <br>
ErrorLog "/data/website/logs/error.log <br>
CustomLog "/data/website/logs/access.log combined <br>
LogLevel alert rewrite:trace3 <br>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
请帮助我更正 LogLevel 语句。谢谢。
如何使我的规则与 cookie 的确切值匹配?我试过了:
RewriteCond %{HTTP_COOKIE} ^its=me$ [NC]
RewriteCond %{HTTP_COOKIE} its=^me$ [NC]
RewriteCond %{HTTP_COOKIE} its="me" [NC]
RewriteCond %{HTTP_COOKIE} its=me [NC]
Run Code Online (Sandbox Code Playgroud)
最后一个几乎有效,但是当额外的文本位于值的末尾时匹配,例如“me2”。仅当itscookie 的确切值为 时me,条件才应为真,之前或之后没有更多内容。
这些值应不匹配:
我正在编辑一个.htaccess文件..
在 RewriteRules 的 RewriteCondition 中,HTTPS_HOST似乎只匹配通过https://协议 (ssl)访问的 url 。我在某处的文档中看到它是一个 T/F 变量,指示是否使用安全协议访问了 url。
然而,我在上文档的麻烦发现是否HTTP_HOST只匹配http://协议,或者如果它有效地匹配//相对的协议,这意味着它符合双方 http:// 和 https://。
有人可以以一种或另一种方式确认,或向我指出此信息的明确来源吗?
此外,如果HTTP_HOST匹配两个协议变体,过滤仅 http://协议匹配的最佳方法是什么?
例子:
<IfModule mod_rewrite.c>
RewriteEngine on
Rewritecond %{HTTP_HOST} ^\/\.(?!some-url).*$
RewriteRule (.*) https://www.example.com/$1 [R=301,L,NC]
</IfModule>
Run Code Online (Sandbox Code Playgroud)
相比之下:
...
Rewritecond %{HTTPS_HOST} ^\/\.(?!some-url).*$
...
Run Code Online (Sandbox Code Playgroud)
编辑:实验表明,HTTP_HOST 这似乎与两种协议都匹配,而HTTPS_HOST仅当协议或 url 以https://.
.
(注重:apache2标签
。TBH,我不能肯定我运行的是什么版本的Apache将尝试找出,这样我就可以装上适当的标签..
我想httpd -v,apache -v, …
mod-rewrite ×10
apache-2.2 ×9
.htaccess ×4
rewrite ×4
php ×3
apache2 ×1
http-headers ×1
httpd.conf ×1
loglevel ×1
mac ×1
mamp ×1
mod-alias ×1
mvc ×1
rewritecond ×1
subdomain ×1
ubuntu ×1