标签: mod-rewrite

mod_rewrite 不转发 GET 参数

我在我的开发机器上使用 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)

php mod-rewrite rewrite apache-2.2

9
推荐指数
1
解决办法
7710
查看次数

为什么根据我的 RewriteRule 所在的位置,我会得到一个双斜杠?

我使用以下代码将所有 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)

但我无法理解这样做的原因。有谁知道为什么?

mod-rewrite rewrite apache-2.2

9
推荐指数
1
解决办法
8580
查看次数

如何让所有 URL 都通过一个 PHP 文件运行?

网址采用这些形式的 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 时,不再需要 /。

php mod-rewrite mvc apache-2.2

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

为什么我的 RewriteLog 不起作用?

我有一个 .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 日志文件?

mod-rewrite mac .htaccess mamp apache-2.2

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

如何将任何 ServerAlias 重定向到相应的 ServerName?

我想 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

mod-rewrite httpd.conf mod-alias apache-2.2

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

.htaccess 无法正确重定向到以 www 为前缀的页面

我正在尝试重定向没有 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)

php mod-rewrite .htaccess http-headers apache-2.2

9
推荐指数
1
解决办法
1838
查看次数

创建 VHost 并将子域转发给它

宗师

我有一个简单的 .htaccess 文件,我只将非 www 重定向到我的 web 应用程序的 www。现在我想做的是

  1. 创建一个新的虚拟主机,如http://subdomain.mydomain.tld
  2. 为进入该子域的任何人创建一个重定向到我的应用程序上的文件夹,例如app/webroot/subdomain

我当前的 .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

谢谢

ubuntu mod-rewrite .htaccess subdomain apache-2.2

8
推荐指数
1
解决办法
230
查看次数

如何启用 mod_rewrite 详细日志记录

我正在尝试在 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 语句。谢谢。

mod-rewrite loglevel apache-2.2

8
推荐指数
1
解决办法
7397
查看次数

如何使 RewriteCond %{HTTP_COOKIE} 与 cookie 值完全匹配?

如何使我的规则与 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,条件才应为真,之前或之后没有更多内容。

这些值应匹配:

  • 我2
  • [空字符串]
  • [根本没有设置cookie]

mod-rewrite rewrite rewritecond apache-2.2

8
推荐指数
2
解决办法
3万
查看次数

apache .htaccess 文件中的 HTTP_HOST 和 HTTPS_HOST 有什么区别?

我正在编辑一个.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 -vapache -v, …

mod-rewrite rewrite .htaccess apache2

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