标签: mod-rewrite

mod-rewrite:替换 url 中的一些字符

是否可以在 RewriteRule 中将 URL 的一些正斜杠 (/) 替换为点 (.)?它不必专门用 RewriteRule 来完成,但绝对不是用脚本来完成的。

示例 1:

输入:/document/my/document.html
输出:/document-my.document.html

示例 2:

输入:/document/depth/of/path/can/vary.html
输出:/document-depth.of.path.can.vary.html

mod-rewrite apache-2.2

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

RewriteRules 不会以 LAST 标志停止?

我似乎遇到了 Apache 2.2 的 Rewrite 模块(在 FreeBSD 8 上运行)的问题。我的.htaccess文件如下:

Options -Indexes

RewriteEngine on
RewriteRule ^xpaste$ cross.php [L]
RewriteRule ^x([a-f0-9]*)$ cross.php?id=$1 [L]
RewriteRule ^(gen|[a-f0-9]+)$ index.php?$1 [L]
RewriteRule ^(.*)$ index.php [L] 
Run Code Online (Sandbox Code Playgroud)

然而不知何故,最后一条规则覆盖了其他三条规则。一旦我将其注释掉,其他规则就会按预期工作:

  • www.example.com/xpaste 打开 cross.php
  • www.example.com/x132633 打开 cross.php?id=132633
  • www.example.com/gen 打开 index.php?gen

我已经试过的各种组合LNSS=n每个标志RewriteRule,但除非我注释掉最后一条规则,一切都被定向到index.phpRewriteRule一旦找到匹配项,如何让 Apache 停止处理s?

mod-rewrite rewrite .htaccess apache-2.2

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

通过 .htaccess 传递可选的查询变量

哦,.htaccess 让我头疼。

所以,我有一个网页,它有一个漂亮的 URL foo.com/radio/jobs虽然实际上住在 foo.com/content/directory_jobs.php/?section=radio

我使用 .htaccess 行...

RewriteRule ^(radio|tv|magazines|newspapers)/jobs$ /content/directory_jobs.php?section=$1
Run Code Online (Sandbox Code Playgroud)

同一页面有一个可选的 ?pages= 查询字符串 - 因此您可以访问foo.com/radio/jobs?page=2并查看第二页。

然而,上面的 .htaccess 行没有添加这个 pages 变量:结果是底层的 PHP 脚本没有看到“pages”变量。

我可以调整上面的 .htaccess 行以确保我确实传递了“pages”变量(如果存在)?或者我必须为这样的每个页面设置两条 .htaccess 行吗?

mod-rewrite apache-2.2

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

Apache mod_rewrite 在 URL 末尾添加额外的斜杠

我正在运行 CentOS 6.0 并试图让 mod_rewrite 从任何以它为前缀的 URL 中删除 www。这是我在 httpd.conf 中的代码:

注意:我使用的是具有完全 root 访问权限的 VPS,所以我没有使用 .htaccess 文件或任何“每个目录”设置。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.aaronjwood\.com$
RewriteRule ^(.*)$ http://aaronjwood.com/$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

这适用于所有页面,除了 URL 将写入http://aaronjwood.com//(注意两个斜杠)或http://aaronjwood.com//contact.php。谁能帮我弄清楚为什么会这样?

linux mod-rewrite centos apache-2.2

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

是否可以将一些查询字符串重写为 HTTPS 并将其他所有内容保留在 HTTP 上?

我正在将查询字符串重写为漂亮的 URI,例如:index.php?q=/en/contact变成/en/contact并且一切正常..

# httpd.conf

# HANDLE THE QUERY
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
Run Code Online (Sandbox Code Playgroud)

甚至可以重写单个查询来强制https和强制其他所有内容http吗?我尝试了许多不同的方法,这些方法通常以无限循环结束。我可以编写一个插件来在 PHP 中执行此操作,但认为在服务器 conf 中处理此问题会更有效。我很乐意提供任何建议。

编辑: 为了澄清,我希望能够将非 SSL 重写为http://example.com/index.php?q=/en/contact启用的 SSLhttps://example.com/en/contact以及每个未/en/contact写入的查询http://example.com/...

mod-rewrite rewrite httpd.conf apache-2.2

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

重定向异常

我认为这很容易,但恐怕我无法自己解决所有问题。

我已将网站移至另一个域,并设置了一些永久重定向。但是,我想从任何重写中保留一个 URL。现在我的配置是这样的:

Redirect permanent /olduser/exception/ ???
Redirect permanent /olduser/dir/ http://newuser.domain.com/a.html
Redirect permanent /olduser/other/ http://newuser.domain.com/q.html
Redirect permanent /olduser/other/sub/ http://newuser.domain.com/t/some.html
Redirect permanent /olduser/ http://newuser.domain.com/
Run Code Online (Sandbox Code Playgroud)

当然,第一行是有问题的,因为我在最后一行将整个子目录重定向到新域。在新域上我没有权限,因为它是一个类似于 GitHub 的静态网站。

请注意,我不能简单地使用重写规则,因为旧目录不对应于新文件/目录。或者更好,我看不出我怎么能做到这一点:)

如何/olduser/exception/在不影响其他规则的情况下在旧服务器上工作?

谢谢!

mod-rewrite redirect apache-2.2

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

在 apache 中删除目录的尾部斜杠

www.example.com/advice/现在有以下网址注意到网址末尾的斜杠了吗?我希望将其删除为类似www.example.com/advice. 现在,当我在浏览器中输入该 URL 时,我会被重定向到带有尾部斜杠的 URL,例如使用 curl 也是如此。现在我知道尾部斜杠被添加了,因为建议是一个实际的目录。

[steve@dev dev.www.example.com]$ curl -I  https://dev.www.example.com/advice -k
  HTTP/1.1 301 Moved Permanently
  Date: Fri, 25 Nov 2016 08:20:11 GMT
  Server: Apache/2.4.6 (CentOS)
  Location: https://dev.www.example.com/advice/
  Cache-Control: max-age=0
  Expires: Fri, 25 Nov 2016 08:20:11 GMT
  Connection: close
  Content-Type: text/html; charset=iso-8859-1
Run Code Online (Sandbox Code Playgroud)
[steve@dev dev.www.example.com]$ curl -I https://dev.www.example.com/advice/ -k
HTTP/1.1 200 OK
Date: Fri, 25 Nov 2016 08:21:19 GMT
Server: Apache/2.4.6 (CentOS)
X-Powered-By: PHP/5.6.27
Set-Cookie: flarum_session=mfbou2hcbvcobhncnaqlvl9bm7; Path=/; HttpOnly
X-CSRF-Token: WV69M1oi8POqOcXi6MvwKhbJQ72Tmo2WpFn3oxwq
Content-Length: 10339
Cache-Control: max-age=0
Expires: Fri, …
Run Code Online (Sandbox Code Playgroud)

mod-rewrite rewrite .htaccess rewritecond apache2

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

使用 mod_rewrite 在 apache 中通过模式阻止来自机器人的请求。mod_rewrite 不起作用

我正在尝试通过glitter_calendarapache 上的模式阻止来自机器人的请求。

史前。我的服务器经常被机器人访问。请求 URI 是 ...glitter_calendar.. wordpress 返回 404。服务器甚至每周宕机一次。我尝试用 Fail2ban 阻止它们。没有成功。服务器负载不会下降,我的 iptables 块规则中不断出现新主机。

在我的.htaccess我试图通过模式添加阻止规则glitter_calendar

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{THE_REQUEST} ^.*(wpdffcontent)|(glitter_calendar)|(mp4:).* [NC]
RewriteRule ^(.*)$ - [F,L]
</IfModule>

<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>
Run Code Online (Sandbox Code Playgroud)

发现类似的问题。链接:

我的 mod 重写似乎不起作用。我在 wordpress 中找不到错误 404,而不是通过 …

mod-rewrite .htaccess botnet apache-2.2

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

在使用 mod_proxy_fcgi 和 PATH_INFO 时重写 URL 最终会出现错误 404

我在 Apache 2.4.25 上有一个虚拟主机,PHP-FPM 7.1.4 通过 mod_proxy_fcgi 连接,如下所示:

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /srv/www/example.com

    <Directory /srv/www/example.com>
        AllowOverride All
        Require all granted
    </Directory>

    SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
    <FilesMatch ".+\.ph(p[3457]?|t|tml)$">
        SetHandler "proxy:unix:/run/php/example.sock|fcgi://localhost"
    </FilesMatch>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

大多数应用程序在此设置下都能完美运行,但有一个应用程序使用 PATH_INFO 来提取请求。该应用程序在其 .htaccess 中有类似的内容:

RewriteEngine On

RewriteCond $1 ^index\.php
RewriteRule ^(.*)$ - [PT,L]

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

简单地说,所有不是的东西都index.php应该作为路径传递给它。访问 URL http://example.com/index.php/test可以正常工作并按[PATH_INFO] => /test预期显示,但访问http://example.com/test 会

AH01071: Got error 'Primary script unknown\n'
Run Code Online (Sandbox Code Playgroud)

LogLevel trace6mod_rewrite 和 mod_proxy_fcgi 的设置表明重定向已正确完成,并且正确的路径也传递给 PHP-FPM。

/index.php/test 的跟踪:

[Sat Apr …
Run Code Online (Sandbox Code Playgroud)

mod-rewrite php-fpm apache-2.4 mod-proxy-fcgi

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

Apache:不要为某些不存在的文件(常规文件或符号链接)记录错误

我想阻止 Apache为某些经常请求的不相关的不存在文件记录“文件不存在”错误,例如“apple-touch-icon-120x120.png”。这些日志条目使我的日志变得混乱,并且很难看到“真正的”问题。这就是我想出的:

RewriteCond %{REQUEST_URI} ^/apple-touch-icon(-\d+x\d+)?(-precomposed)?\.png$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^ - [redirect=404]
Run Code Online (Sandbox Code Playgroud)

想法:如果请求的文件不是常规文件,也不是符号链接,则 RewriteRule 将导致不记录错误。这类型的作品。

现在我面临以下问题:如果我实际上创建了一个名为“apple-touch-icon-120x120.png”的符号链接,那么我的 RewriteRule 仍然会触发并且我得到 404。没有规则或当我将文件设为常规文件时文件而不是符号链接,文件被正确提供。我认为通过使用!-l标志,只有当请求的文件不是常规文件并且它也不是符号链接时,我才能触发我的规则。但这似乎不起作用......

我在 Apache 的错误日志中没有看到任何可疑的东西。我在这里可能做错了什么?

mod-rewrite symbolic-link rewritecond apache-2.2

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