是否可以在 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
我似乎遇到了 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.phpwww.example.com/x132633 打开 cross.php?id=132633www.example.com/gen 打开 index.php?gen我已经试过的各种组合L,NS和S=n每个标志RewriteRule,但除非我注释掉最后一条规则,一切都被定向到index.php。RewriteRule一旦找到匹配项,如何让 Apache 停止处理s?
哦,.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 行吗?
我正在运行 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。谁能帮我弄清楚为什么会这样?
我正在将查询字符串重写为漂亮的 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/...
我认为这很容易,但恐怕我无法自己解决所有问题。
我已将网站移至另一个域,并设置了一些永久重定向。但是,我想从任何重写中保留一个 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/在不影响其他规则的情况下在旧服务器上工作?
谢谢!
我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) 我正在尝试通过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,而不是通过 …
我在 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) 我想阻止 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 ×10
apache-2.2 ×8
.htaccess ×3
rewrite ×3
rewritecond ×2
apache-2.4 ×1
apache2 ×1
botnet ×1
centos ×1
httpd.conf ×1
linux ×1
php-fpm ×1
redirect ×1