Concrete5 漂亮 URL 的 (mod_rewrite) 停止工作

Concrete5 pretty URL's (mod_rewrite) stopped working

我管理两个网站,都运行使用 Concrete5 CMS (v5.6.3.4),它使用 .htaccess 文件重写 URL,因此 'index.php'文件被隐藏,URL 看起来好多了。类似于 Wordpress 所做的。 Concrete5添加的.htaccess内容为:

<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME}/index.html !-f RewriteCond %{REQUEST_FILENAME}/index.php !-f RewriteRule . index.php [L] </IfModule>

这曾经很好用,但现在只能访问主页。当我访问 /contact 之类的网页之一时,返回 HTTP 301 Moved Permanently 并且我被重定向到主页。

当我访问 /index.php/contact 时,联系页面会正确加载。 我还尝试了 Wordpress 重写规则,结果相同。

它似乎因为某些 Apache、PHP 或 mod_rewrite 模块版本更改或我的托管公司的原因而停止工作。 Apache 2.4.17 和 PHP 5.5.30 上的站点 运行。我找不到 mod_rewrite 模块版本。

我也尝试了 Apache FallbackResource /index.php,它似乎适用于子页面,但在那种情况下主页加载失败。

感谢任何帮助。

更新:

Apache 加载的模块是:

核心mod_authn_filemod_authn_dbmmod_authn_anonmod_authn_dbdmod_authn_socachemod_authn_coremod_authz_hostmod_authz_groupfilemod_authz_user mod_authz_dbm mod_authz_owner mod_authz_dbd mod_authz_core mod_access_compat mod_auth_basic mod_auth_form mod_auth_digest mod_allowmethods mod_file_cache mod_cache mod_cache_disk mod_cache_socache mod_socache_shmcb mod_socache_dbm mod_socache_memcache mod_so mod_macro mod_dbd mod_dumpio mod_buffer mod_ratelimit mod_reqtimeout mod_ext_filter mod_request mod_include mod_filter mod_substitute mod_sed mod_deflate http_core mod_mime mod_log_config mod_log_debug mod_logio mod_env mod_expires mod_headers mod_unique_id mod_setenvif mod_version mod_remoteip mod_proxy mod_proxy_connect mod_proxy_ftp mod_proxy_http mod_proxy_fcgi mod_proxy_scgi mod_proxy_wstunnel mod_proxy_ajp mod_proxy_balancer mod_proxy_express mod_session mod_session_cookie mod_session_dbd mod_slotmem_shm mod_ssl mod_lbmethod_byrequests mod_lbmethod_bytraffic mod_lbmethod_bybusyness mod_lbmethod_heartbeat mod_unixd mod_dav mod_status mod_autoindex mod_info mod_suexec mod_cgi mod_dav_fs mod_dav_lock mod_vhost_alias mod_negotiation mod_dir mod_actions mod_speling mod_userdir mod_alias mod_rewrite mod_php5 mod_ruid2 预叉

我 运行 一个类似的 apache / php 版本,我能看到的唯一区别是:

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

注意index.php前面的/。试试看,然后在你的条件中添加两个额外的条件,看看它是否有效。

注意,这是在 .htaccess 和我在 apache 中的实际虚拟主机文件中。

您确定 mod 重写已启用吗?尝试一个简单的规则作为测试:

RewriteRule ^xxx https://google.com [R=301,L]

在你拥有的重写块之前,保存,重新启动 apache(如果它不是 .htaccess),然后尝试访问:你的网站。com/xxx

如果它有效,并且您最终达到 google,那么重写就可以了。

如果还没有检查 phpinfo(),您应该会看到这个或类似的东西:

Configuration
apache2handler

Loaded Modules  core mod_so http_core [...] mod_alias mod_rewrite [...]

顺便说一句,你提供的数据非常好。

据我所知,Apache 和它的 mod 规则是一起发布的,至少是标准的,虽然我可能是错的,但我相信大多数安装都是这样的,所以它至少是高度那里不太可能出现问题,但很有可能是托管公司可能忘记打开 mod 重写,我在这里看到过几次类似的问题。

更新:

我用 firefox live http headers:

测试了你的 urls
GET /aanleg/ HTTP/1.1
HTTP/1.1 301 Moved Permanently
Location: http://yoursite.com

我第一次写你的重定向工作正常,但它工作不正常,这是完全错误的,因为不应该有重定向。

既然你运行phpinfo,php也是运行ning.

您需要显示整个 htaccess,因为您有一个错误的规则正在重定向 url。

RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\.yoursite\.nl [NC]
RewriteRule ^(.*)$ http://www.yoursite.nl/ [R=301,L]

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

除非您有特定的重写,否则这就是重写所需的全部内容,但显然有一个重写规则将所有内容发送到 / 这不应该发生。

更新:这个问题几乎可以肯定是一个具体问题,而不是 apache 重定向问题。

这原来与 Apache 升级有关。 可以通过添加解决问题:

定义('SERVER_PATH_VARIABLE', 'REQUEST_URI');

到config/site.php

详情请看这里: http://www.concrete5.org/developers/bugs/5-6-3-4/every-page-returns-page-not-found-except-home-page-with-pretty-u/

感谢 Concrete5 论坛的用户 sandsoft!

concrete5 的遗留 (5.6) 版本的下一个版本将不会遇到这个问题:它已被 https://github.com/concrete5/concrete5-legacy/pull/1931

修复