我正在为客户管理一个电子商务网站,该网站是使用 Apache 上的 JShop 构建的。出于 SEO 的原因,链接类似于:
http://www.domain.com/shop/section/3151/1/flowers
http://www.domain.com/shop/product/35465/blueflower
Run Code Online (Sandbox Code Playgroud)
映射到:
http://www.domain.com/shop/section.php/3151/1/flowers
http://www.domain.com/shop/product.php/35465/blueflower
Run Code Online (Sandbox Code Playgroud)
提供与以下相同的页面:
http://www.domain.com/shop/section.php?xSec=3151&xPage=1
http://www.domain.com/shop/product.php?xSec=35465
Run Code Online (Sandbox Code Playgroud)
不知何故,这是在没有mod_rewrite 的情况下实现的(我已经通过禁用 mod_rewrite 并注释掉所有 conf 和 .htaccess 文件中的所有重写规则来确认这一点)。
注意:文件 section.php 和 product.php 存在,但 section 和 product 不存在,也没有符号链接。
问题是在生产服务器上这种行为停止发生。在我的开发服务器上它仍然有效。我能够通过使用 mod_rewrite 使生产服务器再次正常工作,因为这是我知道如何做到这一点的唯一方法。但是,我真的需要首先知道生产服务器上发生了什么变化,以便我可以正确理解问题(以避免其他不可预见的后果)。我已经重新启动了 Apache 并撤消了在 URL 损坏时我在生产服务器上所做的所有更改。它们仍然被破坏(没有我的新重写规则)。
除了mod_rewrite之外,还有哪些方法可用于从 URL 中删除 .php 扩展名?
我是 Apache mod 重写的新手。我想达到的就是这个。
如果从 url 请求图像 (gif, jpg, png) 并且在那里找不到,它应该自动尝试从另一个目录传递此图像。
Apache 2.2(在运行 cPanel 的服务器上)似乎忽略了返回 410 状态的指令。
这发生在 mod_alias 的 Redirect(使用410或gone)和 mod_rewrite 的 RewriteRule(使用[G]),在 .htaccess 文件中使用。
这有效:
Redirect 302 /somewhere /gone
Run Code Online (Sandbox Code Playgroud)
但这不会:
Redirect 410 /somewhere
Run Code Online (Sandbox Code Playgroud)
该行将被忽略(就像它已被注释一样)并且请求会落入其他规则(将其定向到不相关的通用错误处理脚本)。
类似地,尝试使用带有 [G] 标志的 RewriteRule 不起作用,但是将相同的规则重写为生成 410 的脚本可以 - 所以规则不是问题,它似乎是关于 410/没有表现。
我可以通过让脚本发送 410 来解决它,但这很烦人,我不明白为什么它不起作用。
有任何想法吗?
我有一个现有的 .htaccess 文件,其重写条件如下:
RewriteCond %{HTTP_HOST} !^go\.domain\.com$ [NC]
RewriteRule ^(.*)$ https://go.domain.com [R,L]
Run Code Online (Sandbox Code Playgroud)
本质上,该域上的所有内容都被强制转移到go子域。
然而,有一个网址我想保留原样,而不是重写:
www.domain.com/terms
Run Code Online (Sandbox Code Playgroud)
如何添加额外的 RewriteCond 以排除此特定 url?
我正在尝试使用 mod_rewrite 创建一个宁静的 API。
我有一个规则:
RewriteRule v2/(.*)$ v1/index.php?request=$1 [QSA,NC,L]
Run Code Online (Sandbox Code Playgroud)
然而,路径可能包含 base64 编码的字符串(即可以有 + 或 /)并且它们在到达 PHP 之前被解码。
例如,如果我去
/v2/cards/9VwQLli%2Bf0ogFl19AVRFLuztbp8cP0rYCgXBu3H9%2BDc%3DBe
Run Code Online (Sandbox Code Playgroud)
PHP 获取$_REQUEST['request']为cards/9VwQLli f0ogFl19AVRFLuztbp8cP0rYCgXBu3H9 Dc=Be'.
更糟糕的是,如果我在其中添加斜杠(例如9VwQLli%2Bf0ogFl19AVRFLuztbp8c%2FP0rYCgXBu3H9%2BDc%3DBe-%2F是斜杠),我会得到 404。
我怎样才能防止这种情况发生?
注意:我尝试了B和NE标志,但它们没有任何效果。我想作为一个黑客,我可以将所有+字符_都转换/为-,或者甚至是双 url 编码,但我想知道是否有更好的方法。
我想任何URL映射如localhost/first要localhost/first.php在Ubuntu 15.04使用mod_rewrite为Apache。
以下是步骤。
phpinfo()打印正确的信息。在/etc/apache2/sites-enabled/000-default.conf,在适当的地方添加了以下内容。
<VirtualHost *:80>
<Directory /var/www/html>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>
-- Restart Apache
Run Code Online (Sandbox Code Playgroud).htaccess在/var/www/html,
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^\.]+)$ $1.php [NC,L]
Run Code Online (Sandbox Code Playgroud)chmod 644 /var/www/html/.htaccess
但是像/localhost/second这样的请求不会转换为second.php.
已编辑.htaccess,将最后一行更改为RewriteRule ^second$ second.php. 然而没有成功。
在 Apache …
我在 Suse 机器上安装了 Apache 2。我浏览了它的配置文件,检查了 Yast 中安装了哪些模块,甚至尝试在 .htaccess 中编写一个不起作用的重写规则。我似乎无法在任何地方找到 mod_rewrite。
我认为这意味着没有安装 mod_rewrite 吗?我怎样才能确定?
我在 ServerFault 上看到过这个上一个问题,我想要类似的东西,但我不确定如何完成它。
我想要的是从永久链接中删除所有斜杠,除了域名后面的斜杠。例如:
http://www.muycomputerpro.com/Actualidad/Especiales/La-Ciudad-Eficiente-Netapp
将被重定向到
http://www.muycomputerpro.com/ActualidadEspecialesLa-Ciudad-Eficiente-Netapp
我需要它来纠正Apache Web 服务器下我的 WordPress 博客上剩余的一些 404 错误。那么,正确的重写规则是什么?
文件名在 EXT3 上的默认长度限制为 255 个字符。我有一个独特的要求,我需要更长的文件名(显然是因为 apache 的 mod_rewrite 使用文件名进行存储)。是否有任何设置我可以调整以将这个限制从 255 个字符增加?(或者,如果我可以更改 mod_rewrite 设置以不使用文件)
.htaccess 起初运行良好,然后我在 .htacess 中添加了两行以启用 RewriteLog。结果是我无法打开我的网站。
我添加到我的 .htaccess 中的两行如下:
RewriteLog /home/bigmeow/mylog/rewrite.log
RewriteLogLevel 9
Run Code Online (Sandbox Code Playgroud)
启用 rewritelog 的 .htaccess 如下:
less .htaccess
RewriteEngine On
RewriteBase /blog/
RewriteLog /home/bigmeow/mylog/rewrite.log
RewriteLogLevel 9
RewriteRule ^index\.php$ - [L]
# uploaded files
RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]
# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^[_0-9a-zA-Z-]+/(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^[_0-9a-zA-Z-]+/(.*\.php)$ $1 [L]
RewriteRule . index.php [L]
Run Code Online (Sandbox Code Playgroud)
当我尝试打开我的网站时收到的错误消息:
Internal Server Error
The server encountered an …Run Code Online (Sandbox Code Playgroud) 我想在 apache2.2 中使用谷歌友好的 301 将所有 www 重定向到非 www
它基本上可以工作,但是当我在浏览器中输入 www.test.net 时,我被重定向到 test.net// 并且我希望没有双斜杠。
这是在我的 VHOST 中:
RewriteCond %{HTTP_HOST} ^www.test.net [NC]
RewriteRule ^(.*)$ http://test.net/$1 [L,R=301]
Run Code Online (Sandbox Code Playgroud)
编辑:更糟糕的是:
浏览器中的 www.test.net/home 被重定向到 test.net//home
如何将我的网站从所有 HTTP 请求重定向到 HTTPS,并将非 www HTTPS 重定向到带有 www 的 HTTPS?
例子:
重定向 HTTP 非 www、HTTP www。& HTTPS 非 www:
HTTP://example.com/&& HTTP://www.example.com/&&HTTPS://example.com/
带有 www. 的 HTTPS 的所有内容:
HTTPS://www.example.com/
我有这个 apache 配置:
<VirtualHost *:80>
DocumentRoot "/home/example/public_html/"
ServerName www.example.com
<Directory "/home/example/public_html/">
allow from all
RewriteEngine on
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
</Directory>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
重定向似乎永远不会触发,只是从 http 提供文件。我尝试了各种组合,但似乎没有任何效果。
mod_rewrite 已启用(使用 LoadModule rewrite_module modules/mod_rewrite.so)
任何人都可以帮忙吗?
mod-rewrite ×13
apache-2.2 ×9
.htaccess ×5
php ×2
wordpress ×2
apache-2.4 ×1
apache2 ×1
encoding ×1
ext3 ×1
httpd ×1
https ×1
linux ×1
mod-alias ×1
permalinks ×1
redirect ×1
rewrite ×1
seo ×1
ubuntu ×1